【问题标题】:How does SQS keep track of messages?SQS 如何跟踪消息?
【发布时间】:2022-11-22 10:45:12
【问题描述】:

我有一个非常标准的设置,可以将 SQS 提供给 Lambda。 lambda 读取消息并向定义的端点发出 Web 请求。

如果我在处理 SQS 消息期间遇到由于消息格式引起的异常,那么我会将消息放入死信队列。

如果我遇到 Web 请求错误,我会将消息放回馈送队列,以便稍后发出 HTTP 请求。

这似乎工作正常,但我们刚刚遇到一个问题,即 HTTP 端点已关闭 4 天,并且馈送队列丢弃了消息。我想这与队列的保留期设置有关。

问题

  1. 有没有办法知道在 lambda 中一条消息被重播了多少次?

  2. 供给队列如何知道重新入队的消息与最初放入队列的消息相同?

  3. 我目前没有明确地从队列中删除消息。没有那个,似乎没有引起任何问题,没有重新处理消息或任何东西。我应该明确删除它们吗?

【问题讨论】:

  • 您的“将 SQS 提供给 Lambda 的标准设置”是什么?
  • 关于 SQS 消息保留主题,根据文档:“您可以将 Amazon SQS 消息保留期配置为 1 分钟到 14 天的值。默认值为 4 天。一旦达到消息保留配额,您的消息将自动删除了。”
  • 另请注意preventing duplicate message processing 上的这篇知识库文章。
  • 当您“将消息放入死信队列”时,您是说您的 Lambda 函数在该队列中创建了一条新消息,还是让 SQS 将消息移动到该队列?另外,当您说“我将消息放回馈送队列”时,您是说向 SQS 队列写入一条新消息,还是只是返回错误代码并让 SQS 将现有消息保留在队列中?
  • @JohnRotenstein - 我创建了一条新消息并将其放入死信队列。 SQS 将在保留期到期后移动它,但我知道在处理过程中消息何时格式错误,因此我创建了一条新消息并将其移动到死信队列。是的,我创建了一条新消息并将其放回 SQS 队列。我的 lamda 在所有情况下都返回 200,所以我认为应该从队列中删除消息。

标签: amazon-web-services amazon-sqs


【解决方案1】:

正常的流程是:

  • AWS Lambda 函数被触发,消息通过event 参数传递
  • 如果 Lambda 函数成功处理消息,它应该返回一个“成功”代码(200)并且该消息会自动从队列中删除
  • 如果 Lambda 函数是无法处理消息,它应该返回一个“失败”代码(例如 400)并且 Amazon SQS 将自动尝试重新处理该消息(除非它已超过重试次数)
  • 如果 Lambda 函数失败(例如由于超时),Amazon SQS 将自动尝试重新处理消息(除非它已超过重试次数)
  • 如果消息有超过了它的重试次数, Amazon SQS 会将消息移动到死信队列

回答你的问题:

  1. 如果您希望自己对这些活动负责,您可以在消息中使用ApproximateReceiveCount 属性。在请求中,您似乎应该添加AttributeNames=['ApproximateReceiveCount'],但文档有点矛盾。您可能需要改用 All
  2. 由于您要向队列发送新消息,因此 Amazon SQS不是意识到这是同一条消息。消息是不是're-enqueued' 因为它是一条新消息。
  3. 当您的 Lambda 函数返回“成功”(200) 时,系统会为您从队列中删除消息。

    您可能会考虑使用重试和死信队列的标准功能,而不是自己实现该逻辑。

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多