SQS只发送一次消息

Vla*_*mir 13 amazon-sqs amazon-web-services

假设我有100个线程从相同的sqs读取 - 是否保证每条消息最多只能传送一次?是否可以不止一次地传递相同的消息?我找不到关于这个问题的任何明确的文件.小号

Ant*_*ace 28

2016年11月17日更新: 今天刚刚发布了具有保证一次交付的FIFO排队(此答案最初发布后差不多2年),SQS现在支持一次性交付.以下是详细信息:

  • 您需要创建FIFO队列.
  • 重复数据删除检查MessageDeduplicationId作为队列消息的属性,并通过检查后的任一操作,防止在5分钟重复数据删除间隔中发送和接收重复消息MessageDeduplicationId.
  • 如果在FIFO队列上显式启用基于内容的重复数据删除,MessageDeduplicationId则将使用消息正文的SHA-256哈希自动生成(仅限内容,而不是属性).
  • 如果未启用基于内容的重复数据删除,则必须为MessageDeduplicationIdon send 显式设置自己的任意值.否则SendMessage将失败并显示错误.

创建队列更新队列属性时,可以启用基于内容的重复数据删除.

有关SendMessageReceiveMessage文档中的MessageDeduplicationId的更多详细信息.


2016年11月17日之后,这仍然适用于标准(非FIFO)队列:

由于SQS中标准(非FIFO)队列的分布式特性,保证"至少"一次.

来自FAQ:

问:我会收到多少次邮件?

Amazon SQS旨在为其队列中的所有消息提供"至少一次"传递.虽然大多数情况下每条消息只会传递给您的应用程序一次,但您应该设计系统,以便多次处理消息不会产生任何错误或不一致.

有关至少一次交货的更多信息:

Amazon SQS将您的消息副本存储在多个服务器上,以实现冗余和高可用性.在极少数情况下,当您收到或删除邮件时,其中一个存储邮件副本的服务器可能不可用.如果发生这种情况,则不会在该不可用的服务器上删除该邮件的副本,并且您可能会在收到邮件时再次收到该邮件副本.因此,您必须将应用程序设计为幂等的(即,如果它不止一次地处理相同的消息,则不得对其产生负面影响).

如果您确实需要保证应用程序中"最多一次"处理,您可能希望您的应用程序检查SQS消息唯一标识符,而不是处理您之前处理或当前正在处理的消息ID.