为什么我的 Lambda 函数重试有效的 Amazon SQS 消息并将其放入死信队列中?
上次更新日期:2021 年 11 月 1 日
我配置了 AWS Lambda 函数以处理 Amazon Simple Queue Service (Amazon SQS) 中的消息。现在,我的一些有效 Amazon SQS 消息在达到 maxReceiveCount 之前会被多次接收,最终进入我的死信队列。为什么会发生这种情况,我如何确保 Lambda 函数处理所有有效的 Amazon SQS 消息?
简短描述
如果您的 Lambda 函数受限、返回错误或在读取 Amazon SQS 消息批处理时没有响应,则消息会返回到您的队列。可见性超时发生后,您的 Lambda 函数会再次接收消息批次。如果您的函数多次未能处理有效消息,则 Amazon SQS 会将这些消息发送到死信队列(如果已配置此队列)。
为了防止有效的消息被放入死信队列中,您的函数代码必须是幂等的,并且能够多次处理消息。如需更多信息,请参阅如何防止 Amazon SQS 消息多次调用我的 Lambda 函数?
解决方法
验证您的 Lambda 函数的代码是幂等的
有关幂等性最佳实践和示例函数逻辑,请参阅如何让我的 Lambda 函数幂等?
验证您的 Amazon SQS 队列的可见性超时至少是 Lambda 函数超时设置的六倍
将源队列的可见性超时设置为至少比函数超时长六倍。如果函数在处理上一个批次时受到限制,则额外的时间可让您的函数重试处理该批次。
有关更多信息,请参阅 Amazon SQS 开发人员指南中的设置可见性超时。
注意:如果您的函数因为队列的可见性超时不够长而未接收消息,则这些消息将不会记录在 Amazon CloudWatch Logs 中。
验证源队列的再驱动策略中的 maxReceiveCount 属性是否至少设置为 5
将源队列的再驱动策略上的 maxReceiveCount 至少设置为 5。如果您的函数返回错误,或者因为它处于最大并发而无法调用,则处理可能会成功,但需要额外的尝试。至少为 5 的maxReceiveCount 可让您的消息在发送到死信队列之前有更多机会得到处理。
识别并解决您的 Lambda 函数返回的任何错误
按照如何排查 Lambda 函数故障?中的说明进行操作 只有当函数没有返回错误时,函数才会自动从队列中删除消息。