【问题标题】:How to prevent AWS SQS from deleting a message when Lambda function triggered fails to process that message?当触发的 Lambda 函数无法处理该消息时,如何防止 AWS SQS 删除该消息?
【发布时间】:2019-05-20 07:01:39
【问题描述】:

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

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

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

对此问题的任何见解都会非常有帮助。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-sqs


    【解决方案1】:

    来自AWS Lambda Retry Behavior - AWS Lambda

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2017-04-29
      • 2019-08-16
      相关资源
      最近更新 更多