【发布时间】:2015-07-23 03:19:51
【问题描述】:
简单的问题: 我想在 Amazon 上运行一个自动缩放组,它会启动多个实例来处理来自 SQS 队列的消息。但是我怎么知道实例没有处理相同的消息?
我可以在处理完消息后从队列中删除消息。但是,如果它还没有被删除并且仍然被一个实例处理,另一个实例可以下载相同的消息并处理它,我认为。
【问题讨论】:
标签: amazon-web-services amazon-sqs
简单的问题: 我想在 Amazon 上运行一个自动缩放组,它会启动多个实例来处理来自 SQS 队列的消息。但是我怎么知道实例没有处理相同的消息?
我可以在处理完消息后从队列中删除消息。但是,如果它还没有被删除并且仍然被一个实例处理,另一个实例可以下载相同的消息并处理它,我认为。
【问题讨论】:
标签: amazon-web-services amazon-sqs
除了 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。
【讨论】:
您可以收到重复的消息,但只能收到“on rare occasions”。所以你应该以幂等性为目标。
【讨论】: