当触发的 Lambda 函数无法处理该消息时,如何防止 AWS SQS 删除该消息?

Jou*_*ude 2 amazon-sqs amazon-web-services aws-lambda

我部署了一个 AWS Lambda 函数,该函数在 SQS 队列收到消息时触发。该函数向 Rest API 发出请求,如果响应不是 Ok,则需要再次处理 SQS 消息。

这就是为什么我需要将消息重新发送到队列,但我更愿意以编程方式删除 SQS 消息,尽管我找不到如何配置 SQS。我尝试过消息保留,但似乎触发事件导致消息被删除。

其他可能的选项可能是在 S3 中备份消息或将其保留在 DynamoDB 中,但我想知道是否有更好的选择。

关于这个问题的任何见解都会非常有帮助。

Joh*_*ein 6

AWS Lambda 重试行为 - AWS Lambda

如果您将 Amazon SQS 队列配置为事件源,AWS Lambda 将轮询队列中的一批记录并调用您的 Lambda 函数。如果调用失败或超时,批处理中的每条消息都将返回到队列中,一旦可见性超时期限到期,每个消息都可以进行处理。(可见性超时是 Amazon Simple Queue Service 阻止其他消费者接收和处理消息的时间段)。

一旦调用成功处理了一个批处理该批处理中的每条消息都将从队列中删除。当消息未成功处理时,它要么被丢弃,要么如果您配置了 Amazon SQS 死信队列,则失败信息将被定向到那里供您分析。

因此,似乎(从阅读本文)一个简单的选项是在队列上设置高可见性超时,然后如果函数无法处理消息则引发错误。此消息将在配置的超时期限内保持不可见,然后将重新出现在队列中进行处理。如果超过允许的重试次数,它将被删除或移至死信队列(如果已配置)。

  • @JavaSa 现在可以**批量失败特定消息**。请参阅:[AWS Lambda 现在支持 SQS 的部分批量响应作为事件源](https://aws.amazon.com/about-aws/whats-new/2021/11/aws-lambda-partial-batch-response- sqs-事件源/) (2认同)