有人在PHP中提出了一种优雅的方式来识别SQS刚从之前发送的队列发送了相同的消息吗?如果SQS从未收到过“删除消息”,则可能会发生这种情况。请求者发送请求,因为原始SQS队列可能已关闭,因此其替换将重新发送与Amazon文档相同的消息。 非常感谢任何指针,PHP等代码示例。
答案 0 :(得分:2)
当您处理从SQS收到的消息时,每次收到消息时都会显示相同的消息ID,以及每次更改的收据句柄(用于发送删除消息)。保存消息ID以及消息导致的工作允许应用程序知道不应重复工作。
当然,您需要将yoir队列上的可见性超时设置得足够高,以便在超时到期之前删除每条消息或扩展其不可见性。
SQS的最新成员是能够将消息转移到不同的队列 - 他们称之为“死信队列” - 一旦他们通过原始队列传递了可配置的次数。
这似乎是一个简单的解决方法。
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSDeadLetterQueue.html
总是有可能(虽然我没有发现它)SQS仍然可以不止一次传递消息,因为,作为一个庞大的分布式系统,SQS旨在“至少”传递一次消息,所以你必须适应这种可能性。将消息ID保存在我的数据库中具有唯一约束的列中,这使得无法插入重复项。
Amazon SQS旨在为其队列中的所有邮件提供“至少一次”传递。虽然大多数情况下每条消息只会传递给您的应用程序一次,但您应该设计系统,以便多次处理消息不会产生任何错误或不一致。