假设我有100个线程从相同的sqs读取 - 是否保证每条消息最多只能传送一次?是否可以不止一次地传递相同的消息?我无法找到有关此问题的明确文档。小号
答案 0 :(得分:23)
更新2016年11月17日: FIFO queueing with guaranteed-once delivery刚刚发布(此答案最初发布后差不多2年),SQS现在支持一次性交付。以下是详细信息:
MessageDeduplicationId
作为队列消息的属性,并通过检查MessageDeduplicationId
,阻止在5分钟重复数据删除间隔内发送和接收重复消息。1} LI>
MessageDeduplicationId
。MessageDeduplicationId
显式设置自己的任意值。否则,SendMessage将失败并显示错误。可以在creating a queue或updating the queue' attributes时启用基于内容的重复数据删除。
有关SendMessage和ReceiveMessage文档中MessageDeduplicationId的更多详细信息。
2016年11月17日之后,这仍然适用于标准(非FIFO)队列:
由于SQS中标准(非FIFO)队列的分布式特性,保证代替"至少"一旦。
来自FAQ:
问:我会收到多少次信息?
Amazon SQS旨在提供“至少一次”交付 队列中的消息。虽然大部分时间都是每条消息 只交付给你的应用程序一次,你应该设计你的 系统,以便多次处理消息不会创建任何消息 错误或不一致。
有关at least once投放的更多信息:
Amazon SQS将您的邮件副本存储在多台服务器上,以实现冗余和高可用性。在极少数情况下,当您收到或删除邮件时,其中一个存储邮件副本的服务器可能不可用。如果发生这种情况,则不会在该不可用的服务器上删除该邮件的副本,并且您可能会在收到邮件时再次收到该邮件副本。因此,您必须将您的应用程序设计为幂等的(即,如果它不止一次处理相同的消息,则不得对其产生负面影响。)
如果你真的需要保证"最多一次"在您的应用程序中进行处理时,您可能希望应用程序检查unique identifiers of SQS messages,而不是处理您之前处理或当前正在处理的消息ID。
答案 1 :(得分:2)