【问题标题】:Is it necessary for a Lambda to delete messages from an SQS queue after processing?Lambda 是否需要在处理后从 SQS 队列中删除消息?
【发布时间】:2021-03-25 08:11:41
【问题描述】:

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

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

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

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

想法?

【问题讨论】:

  • 对术语的小注释。在 Lambda 函数无法处理 SQS 消息的情况下,这些消息不会返回到 SQS 队列。相反,它们再次变得可见(一旦它们的可见性超时发生)。这些消息从未离开 SQS 队列。

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


【解决方案1】:

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

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

【讨论】:

  • 在一种情况下,您可能希望 Lambda 直接与 SQS 交互,那就是如果您正在处理一批消息,并且为处理这些消息的某些子集可能会失败做准备,您希望确保成功处理的消息不会在 SQS 中再次可见。您的 Lambda 函数可以显式删除每条 SQS 消息,因为它在这种情况下已成功处理。或者您可以使用中间件,例如middy,为您执行此操作。
  • 不错的答案,但请您添加对 AWS 文档的引用,显示在“lambda 与 sqs 集成”的情况下,lambda 会自动删除消息以防返回成功状态?我在 AWS 文档中的任何地方都找不到它。
  • @Mercury 在此页面的第二段中:docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
【解决方案2】:

Amazon SQS 不会在为您检索消息后自动删除消息,以防您未成功接收消息(例如,如果消费者失败或您失去连接)。要删除消息,您必须发送一个单独的请求,确认您已成功接收并处理了该消息。

这没有改变,将来也可能不会改变,因为我们无法让 SQS 在所有情况下都明确知道消息是否已成功处理。如果 SQS 开始“假设”下游发生的事情,则在许多情况下可能会变得不可靠。

【讨论】:

  • Lambda does the deletion 为您服务,假设批次已成功处理。
  • 是的,对于 Lambda 函数,该服务负责 DeleteMessage 调用。但是,无论如何,队列本身不会做任何假设,必须明确删除消息。
【解决方案3】:

是的,否则下次您请求一组消息时,您将收到相同的消息 - 可能不会在下次通话时,但最终您会收到。您可能不想一遍又一遍地处理同一组消息。

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2020-07-10
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多