AWS Lambda调用boto3的DynamoDB BatchWriteItem跳过条目无法写入如何解决?
问题产生原因
- DynamoDB分区限流触发:DynamoDB按分区分配写入容量,主键相似度高的条目通常归属同一个分区,定时任务批量写入时单分区写入QPS超过上限会触发限流;若使用预置吞吐量模式,突增的批量写入请求超过整体WCU(写入容量单位)也会触发全局限流。手动执行Lambda时一般写入速度更慢、流量更低,不会触达限流阈值,因此写入正常。
BatchWriteItem接口未处理失败条目:BatchWriteItem单次最多支持写入25条数据,遇到限流或临时服务错误时会在返回结果的UnprocessedItems字段中返回未写入成功的条目,若代码未对该部分内容做重试处理,就会出现部分条目随机跳过的情况,符合单次跳过条目数低于20的特征。- Lambda执行超时:定时触发时Lambda大概率为冷启动状态,执行速度低于热启动的手动执行场景,若Lambda超时时间设置过短,可能在未完成所有写入操作时就被强制终止,导致剩余条目未写入。
可行解决方案
- 优化DynamoDB写入逻辑
- 所有写入请求新增指数退避重试逻辑,针对
BatchWriteItem返回的UnprocessedItems做循环重试,直到所有条目全部写入成功。 - 调整DynamoDB容量配置:使用预置吞吐量模式的表可开启WCU自动扩缩容,或根据定时任务的写入峰值调高原值;使用On-Demand模式的表可针对每日固定时段的批量写入任务提前预热容量,避免冷启动限流。
- 打散批量写入的条目顺序,避免同一分区的条目集中提交,降低单分区限流概率。
- 所有写入请求新增指数退避重试逻辑,针对
- 优化Lambda运行配置
- 调高Lambda超时时间,按照实际写入所需最大时长预留30%以上的冗余,避免冷启动场景下执行超时。
- 适当调高Lambda内存配置,更高内存对应更高的CPU算力,可提升代码执行速度,降低超时概率。
- 为Lambda配置死信队列,执行异常时自动将未处理的上下文信息推送到队列中触发二次消费,无需手动重跑。
- 新增监控排查能力
- 在Lambda代码中新增DynamoDB写入异常捕获逻辑,将错误类型、失败条目主键等信息输出到CloudWatch日志,便于快速定位问题。
- 配置DynamoDB的
WriteThrottleEvents指标监控,关联Lambda触发时间的限流事件即可直接验证是否为限流导致的写入失败。
内容的提问来源于stack exchange,提问作者user9438495
相关产品推荐
相关产品推荐

