AWS Lambda配置SQS触发器重试2次却重试10次才进DLQ是什么原因?
SQS触发Lambda异常重试次数不符合预期问题根因分析
核心前提澄清
Lambda控制台配置的「重试尝试:2」参数仅适用于Lambda异步调用场景,SQS触发Lambda属于事件源同步调用,该参数对当前场景完全不生效。SQS触发场景的重试规则优先级如下:
- 高优先级:Lambda SQS事件源映射中配置的「最大接收次数」
- 低优先级:SQS队列本身配置的「最大接收次数」(本次场景中为10)
之前业务正常的原因
你此前在Lambda的SQS事件源映射中配置了最大接收次数为3,即消息最多被Lambda接收处理3次(1次初始执行+2次重试),达到阈值后直接投递到DLQ,不会触发SQS队列本身的10次阈值。
近期异常的根因
- 最常见原因:你近期修改过SQS事件源映射的配置,删除或修改了事件源映射层面的最大接收次数配置,导致重试规则回退到SQS队列本身的10次阈值。
- 次要可能原因:Lambda函数近期更新了错误处理逻辑,出现静默失败情况(捕获了所有异常但没有重新抛出,也没有手动调用SQS API删除消息),Lambda服务判定函数执行成功,消息等待90分钟可见性超时后自动重新入队,接收次数累加。
15小时运行时长的逻辑匹配
SQS的默认可见性超时为90分钟,每次处理失败后消息会被锁定90分钟才会重新可见被消费,10次接收的总耗时约为 9次重试间隔 * 90分钟 + 10次Lambda最大执行时长15分钟 = 960分钟,和你观察到的15小时运行时长完全吻合。
修复方案
- 进入Lambda控制台「配置」-「触发器」页,找到对应SQS触发器,编辑后重新配置「最大接收次数」为3,即可恢复2次重试后投递DLQ的逻辑。
- 校验Lambda函数的错误处理逻辑,确保所有处理失败的场景都会抛出异常,不要静默吞错,避免Lambda误判执行成功。
内容的提问来源于stack exchange,提问作者Rafat
相关产品推荐
相关产品推荐

