如何计算DynamoDB预配置容量?批量更新场景的容量规划咨询
1. DynamoDBMapperConfig.DefaultBatchWriteRetryStrategy(10) 是否需要调整?
默认的10次重试基于指数退避机制,专门处理DynamoDB的限流异常(如ProvisionedThroughputExceededException)。如果后续预配置了足够的写容量,实际运行中限流场景会很少出现,这个重试次数完全够用,无需调整。
如果你的业务对延迟敏感,不想因重试等待过久,可以适当调低(比如5次);若运行中频繁触发限流,也可小幅调高,但10次已是合理的默认值,建议先保留,再根据实际监控的重试数据决定是否调整。
2. Lambda并发数设为5是否需要调整?
需要调整,5的并发数过低,无法在2小时内完成4500万条记录的更新。
举个例子:假设单个Lambda处理一个分区键的记录平均耗时10秒,每个分区下有1000条记录,5个并发每秒最多处理5000条记录,完成4500万条需要25小时,远超出目标时间。
建议按以下方式估算合适的并发数:
- 先测试单个Lambda处理一个分区键的平均耗时(记为
t秒) - 计算每秒需要处理的总记录数:
45000000 / 7200 = 6250条/秒 - 假设每个Lambda每秒处理
r条记录(r = 单分区记录数 / t),则所需Lambda并发数 ≈6250 / r
同时要配置SQS的可见性超时,必须大于Lambda处理单条消息的最大耗时,避免消息被重复投递。
3. 2小时完成更新所需的预配置写容量(WCU)计算
DynamoDB的写容量单位(WCU)规则:1 WCU可处理1次大小≤1KB的写入操作(更新属于写入操作)。你的单条记录平均300字节,因此每条更新消耗1 WCU。
总需求计算
总更新记录数:1500万 + 3000万 = 4500万条
时间:2小时 = 7200秒
每秒需处理记录数:45000000 / 7200 = 6250条/秒 → 理论需要6250 WCU
分表配置建议
- 1500万条的表:
15000000 / 7200 ≈ 2083WCU,建议预留10%-20%缓冲,配置为2300-2500 WCU - 3000万条的表:
30000000 / 7200 ≈ 4167WCU,建议预留10%-20%缓冲,配置为4600-5000 WCU
额外注意事项
- 如果更新的字段涉及全局二级索引(GSI),需要额外为GSI配置对应写容量(计算方式与主表一致)
- 批量写入时,BatchWriteItem每次最多处理25条记录,消耗25 WCU,要确保你的
batchWrite方法正确调用DynamoDB批量接口,避免单条写入浪费容量
代码优化提示
你的Lambda代码存在遗漏:循环结束后,itemSchemaTableWriteItems中剩余的不足25条的记录未被写入,会导致这部分记录无法更新。需在循环结束后添加判断:
// 处理循环结束后剩余的记录 if (!itemSchemaTableWriteItems.isEmpty()) { batchWrite(itemSchemaTableWriteItems); }
内容的提问来源于stack exchange,提问作者user17090811

