【问题标题】:AWS: multiple instances reading SQSAWS:多个实例读取 SQS
【发布时间】:2015-07-23 03:19:51
【问题描述】:

简单的问题: 我想在 Amazon 上运行一个自动缩放组,它会启动多个实例来处理来自 SQS 队列的消息。但是我怎么知道实例没有处理相同的消息?

我可以在处理完消息后从队列中删除消息。但是,如果它还没有被删除并且仍然被一个实例处理,另一个实例可以下载相同的消息并处理它,我认为。

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案1】:

    除了 SQS 多次错误地传递同一消息的可能性很小(即使不太可能,您仍然需要考虑这一点),我怀疑您的问题源于对 SQS 的“”概念缺乏熟悉可见性超时。”

    组件收到消息后,消息还在队列中。但是,您不希望系统中的其他组件再次接收和处理该消息。因此,Amazon SQS 会通过可见性超时来阻止它们,在此期间,Amazon SQS 会阻止其他消费组件接收和处理该消息。

    http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AboutVT.html

    这是防止多个队列运行者看到相同消息的原因。一旦可见性超时到期,消息将再次传递给队列使用者,除非您将其删除,或者它超过了配置的最大传递次数(此时它被删除或进入单独的死信队列,如果您配置了一个)。如果作业花费的时间超过配置的可见性超时,您的使用者还可以向 SQS 发送请求以更改该单个消息的可见性超时。


    更新:

    自从最初编写此答案以来,SQS 在某些 AWS 区域中引入了 FIFO 队列。这些操作与上述相同的逻辑,但有保证按顺序传递和额外的保护措施,以保证不会发生偶尔重复的消息传递。

    FIFO(先进先出)队列旨在在操作和事件的顺序至关重要或不能容忍重复的情况下增强应用程序之间的消息传递。 FIFO 队列还提供一次性处理,但限制为每秒 300 个事务 (TPS)。

    http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html

    将应用程序切换到 FIFO 队列确实需要更改一些代码,并且需要创建一个新队列 - 现有队列不能更改为 FIFO。

    【讨论】:

    • 明确答案!谢谢!因此,当我一次下载并处理一条消息时,应该没有问题 :) 否则我可以更改可见性超时...很高兴知道,谢谢
    • 您好,感谢您的回答。需要快速澄清一下,当 FIFO 队列说完全一次处理时,这是否意味着读取这些 SQS 的消费者只处理这些消息一次或消息只发布到队列中一次。例如,如果有多个进程从队列中读取消息,是否保证每条消息只能被一个进程读取一次。
    • @Abhi 两者兼而有之。 SQS FIFO 队列确保消息仅按顺序传递一次,并提供确保给定消息在 5 分钟间隔内仅排队一次的机制 - 有助于避免诸如网络连接被精确切断之类的情况。成功消息在返回到生产者的途中出现错误的瞬间,导致消息被排队但生产者不确定并重新发送。在这种情况下,消息不会再次入队。
    • 感谢 Michael,但我意识到我无法将 FIFO 队列配置为 s3 存储桶的事件侦听器。
    【解决方案2】:

    您可以收到重复的消息,但只能收到“on rare occasions”。所以你应该以幂等性为目标。

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 2016-05-10
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多