【问题标题】:When should I delete messages in SQS?我应该什么时候删除 SQS 中的消息?
【发布时间】:2019-11-15 13:54:40
【问题描述】:

我的申请包括:

  • 1 个 Amazon SQS 消息队列
  • n 个工人

工人有以下逻辑:

 1. Wait for message from SQS queue
 2. Perform task described in message
 3. Delete the message from the SQS queue
 4. Go to (1)

我希望每条消息仅由一名工作人员接收,以避免多余的工作。

是否有一种机制可以使用 SQS 将消息标记为“正在进行中”,以便其他轮询器不会收到它?

或者,是否适合在收到消息后立即删除?

 1. Wait for message from SQS queue
 2. Delete the message from the SQS queue
 3. Perform task described in message
 4. Go to (1)

如果我采用这种方法,有没有办法恢复收到但未处理的消息,以防工作人员崩溃(步骤 (3) 失败)?


This question 是 Spring 特有的,它包含各种魔法。

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案1】:

    在消费者从队列中接收到 SQS 消息但尚未从队列中删除后,它被认为是“正在进行的”消息。这些消息对其他消费者不可见。

    在 SQS 消息传递中,如果满足以下条件,则认为消息处于“飞行中”:

    1. 您作为消费者已收到,并且
    2. 可见性超时尚未到期,并且
    3. 你没有删除它。

    SQS 的设计目的是让您可以调用 ReceiveMessage 并为您提供一条消息进行处理。您有一些时间(可见性超时)来处理此消息。在此“可见性”超时期间,如果您再次调用 ReceiveMessage,则不会向任何工作人员返回您当前正在使用的消息。它被隐藏了。

    一旦可见性超时到期,消息将能够返回给未来的 ReceiveMessage 调用。如果消费者以某种方式失败,这可能会发生。如果处理成功,则可以删除该消息。

    对 ReceiveMessage 调用隐藏的消息数是“飞行中”数。目前,SQS 队列默认设置为允许最多 120,000 条消息“进行中”。

    http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AboutVT.html

    【讨论】:

    • 所以我的第一个算法是正确的,我只是将VisibilityTimeout 设置得太低了。
    • 是的,它是正确的。完成后删除即可。还要查看死信队列逻辑。它可用于处理队列错误/崩溃。
    • 如果您不使用先进先出队列,则重复消息的可能性很小:docs.aws.amazon.com/AWSSimpleQueueService/latest/…
    【解决方案2】:

    会有一个 ReciepientHandle 字符串与消息一起发送。它将有一个基于队列可见性超时的到期时间。

    您可以使用这个 ReciepientHandle 从队列中删除消息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多