Lambda是否有必要在处理后从SQS队列中删除消息?
我在这里查看 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 不会自动删除消息,需要在代码中明确删除它们。我想知道从那以后是否有什么变化。
想法?
回答
这里的关键是您正在使用AWS Lambda 与 SQS 的集成。在这种情况下,AWS Lambda 处理从队列中检索消息(通过event对象使它们可用),并在 Lambda 函数返回成功状态时自动为您从队列中删除消息。如果 Lambda 函数抛出错误,它不会从队列中删除消息。
将 AWS Lambda 与 SQS 集成时,您根本不应使用 AWS 开发工具包与 SQS 队列交互。
- There's one scenario in which you might want the Lambda to interact directly with SQS, and that's if you're processing a batch of messages and, in preparation for the potential failure to process some subset of those messages, you want to be sure that the successfully-processed messages do not become visible again in SQS. Your Lambda function can explicitly delete each SQS message as it is successfully processed in this case. Or you can make use of middleware, such as [middy](https://github.com/middyjs/middy/tree/master/packages/sqs-partial-batch-failure), to do this for you.