触发方式为SQS的AWS Lambda不停重试放回队列的相关问题咨询
AWS Lambda 对接 SQS 循环消费问题解答
问题1:是否需要返回特定内容完成SQS消息确认?
不需要手动返回特殊内容,Lambda和SQS的集成默认自动处理消息生命周期:
- 当Lambda函数无异常执行完成时,Lambda会自动调用SQS的
DeleteMessage接口移除已处理消息,不需要你手动实现确认逻辑。你认知里SQS没有ack/nack是对的,它的消息确认本质就是调用删除接口完成的。 - 只要Lambda执行过程中抛出未捕获的异常、触发运行超时/内存超限被强制终止,Lambda就不会调用删除接口,消息会等待队列设置的
可见性超时到期后,重新回到可消费状态被再次拉取。
如果出现无报错也重放的情况,优先排查两个常见原因:
- Lambda函数的执行时长超过了SQS队列的
可见性超时阈值,函数还没跑完,消息已经因为可见性到期被放回队列 - 代码包含未捕获的异步异常,虽然进程没有退出,但Lambda判定执行失败,触发消息重放
如果使用SQS批量消费触发(一次拉取多条消息),可以手动返回如下格式内容,告知Lambda部分消息处理失败,其余成功消息会被自动删除:
{ "batchItemFailures": [ {"itemIdentifier": "<处理失败消息的receiptHandle>"} ] }
问题2:如何设置消息失败最大重试次数?
有两层配置可以实现重试次数限制,搭配使用可彻底避免无限循环:
- SQS队列层配置:可以给队列设置
最大接收次数(Maximum receives),阈值范围1~1000,同一条消息被拉取的次数超过阈值且未被删除时,会自动被转移到你提前绑定的死信队列(DLQ),不会再被主队列消费。 - Lambda事件源层配置:SQS触发Lambda的事件源配置项里可以设置
最大重试次数,Lambda调用失败超过指定次数后,会直接把消息投递到你配置的死信队列,不再触发重试。
建议优先配置SQS队列的死信队列和最大接收次数,适配所有消费者的重试逻辑。
内容的提问来源于stack exchange,提问作者Luke Skywalker
相关产品推荐
相关产品推荐

