SQS只发送一次消息

时间:2015-01-23 14:21:39

标签: amazon-web-services amazon-sqs

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

2 个答案:

答案 0 :(得分:23)

更新2016年11月17日: FIFO queueing with guaranteed-once delivery刚刚发布(此答案最初发布后差不多2年),SQS现在支持一次性交付。以下是详细信息:

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

可以在creating a queueupdating the queue' attributes时启用基于内容的重复数据删除。

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


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

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

来自FAQ

  

问:我会收到多少次信息?

     

Amazon SQS旨在提供“至少一次”交付   队列中的消息。虽然大部分时间都是每条消息   只交付给你的应用程序一次,你应该设计你的   系统,以便多次处理消息不会创建任何消息   错误或不一致。

有关at least once投放的更多信息:

  

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

如果你真的需要保证"最多一次"在您的应用程序中进行处理时,您可能希望应用程序检查unique identifiers of SQS messages,而不是处理您之前处理或当前正在处理的消息ID。

答案 1 :(得分:2)

您需要使用FIFO队列,但仍然需要生成一个保证邮件不重复的数字,您可以在请求中将生成的数字设置MessageDeduplicationId,然后再发送给SQS。

更容易地,您可以为FIFO队列打开Content-Based-Deduplication,并通过基于发送消息的内容创建散列来避免重复数据删除,让AWS本身为您管理重复数据。

  • 从控制台转到SQS服务,选择队列,然后从Actions中选择Configure queue

enter image description here

  • 打开Content-Based Deduplication

enter image description here