Lambda 是否有必要在处理后从 SQS 队列中删除消息?

use*_*112 2 amazon-sqs amazon-web-services aws-sdk aws-lambda

我在这里查看 AWS SQS 文档:https : //docs.aws.amazon.com/sdk-for-net/v3/developer-guide/ReceiveMessage.html#receive-sqs-message

我的理解是,我们需要AmazonSQSClient.DeleteMessage()在完成处理后删除消息,但是当我们使用 SQS 触发的 Lambda 时,这是否必要?

我正在使用由 触发的 Lambda 函数进行测试SQSEvent,除非我弄错了,否则看起来如果 Lambda 函数运行完成而没有抛出任何错误,则消息不会返回到 SQS 队列。如果这是真的,我宁愿避免对AmazonSQSClient.DeleteMessage().

是 2019 年的一个类似问题,最佳答案是 SDK 不会自动删除消息,需要在代码中明确删除它们。我想知道从那以后是否有什么变化。

想法?

Mar*_*k B 7

这里的关键是您正在使用AWS Lambda 与 SQS 的集成。在这种情况下,AWS Lambda 处理从队列中检索消息(通过event对象使它们可用),并在 Lambda 函数返回成功状态时自动为您从队列中删除消息。如果 Lambda 函数抛出错误,它不会从队列中删除消息。

将 AWS Lambda 与 SQS 集成时,您根本不应使用 AWS 开发工具包与 SQS 队列交互。

  • 在一种情况下,您可能希望 Lambda 直接与 SQS 交互,即如果您正在处理一批消息,并且为处理这些消息的某些子集可能出现故障做好准备,您希望确保成功处理的消息不会在 SQS 中再次可见。您的 Lambda 函数可以显式删除每条 SQS 消息,因为在这种情况下已成功处理该消息。或者您可以使用中间件,例如 [middy](https://github.com/middyjs/middy/tree/master/packages/sqs-partial-batch-failure) 来为您执行此操作。 (4认同)
  • 这里的小更新:Lambda 现在支持 SQS 的[部分批量失败](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#services-sqs-batchfailurereporting),由此 Lambda 函数可以返回失败消息的列表,只有那些消息会再次变得可见。 (4认同)
  • @Mercury 它位于此页面的第二段中:https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html (2认同)
  • 在评论@jarmod之后,这里有一个关于此主题的视频:https://www.youtube.com/watch?v=8zysQqxgj0I&t=1263s (2认同)