Php 如何处理SQS向请求者重新发送相同消息

Php 如何处理SQS向请求者重新发送相同消息,php,amazon-sqs,Php,Amazon Sqs,有人在PHP中想出了一种优雅的方法来识别SQS刚刚从队列中向您发送了它之前发送的相同消息吗?如果SQS从未收到请求者发送的“deletemessage”请求,则可能发生这种情况,因为原始SQS队列可能已关闭,因此其替换者将根据Amazon文档重新发送相同的消息。 非常感谢PHP中的任何指针、代码示例等。当您处理从SQS收到的消息时,每次收到消息时都会有一个相同的消息id,以及一个每次都会更改的接收句柄(用于发送删除消息)。将消息ID与您根据消息所做的工作一起保存,可以使应用程序意识到不应重复该工

有人在PHP中想出了一种优雅的方法来识别SQS刚刚从队列中向您发送了它之前发送的相同消息吗?如果SQS从未收到请求者发送的“deletemessage”请求,则可能发生这种情况,因为原始SQS队列可能已关闭,因此其替换者将根据Amazon文档重新发送相同的消息。
非常感谢PHP中的任何指针、代码示例等。

当您处理从SQS收到的消息时,每次收到消息时都会有一个相同的消息id,以及一个每次都会更改的接收句柄(用于发送删除消息)。将消息ID与您根据消息所做的工作一起保存,可以使应用程序意识到不应重复该工作

当然,您需要将yoir队列上的可见性超时设置得足够高,以便在超时过期之前删除每条消息或扩展其不可见性

SQS最近增加的一项功能是,一旦消息通过原始队列传递了可配置的次数,就可以将消息转移到另一个队列(他们称之为“死信队列”)

这似乎是一个足够简单的解决办法

SQS始终有可能(尽管我没有发现这种情况)多次传递消息,因为作为一个大规模的分布式系统,SQS被设计为“至少”一次传递消息,所以您必须适应这种可能性。将消息ID保存在数据库中具有唯一约束的列中,这使得插入重复项成为不可能

AmazonSQS旨在为其队列中的所有消息提供“至少一次”传递。尽管在大多数情况下,每条消息只会被传递到应用程序一次,但您应该设计系统,以便多次处理消息不会产生任何错误或不一致


谢谢你的全面回复。我在Amazon文档中找不到确认,如果Amazon再次发送相同的消息,它将具有相同的消息id,但是如果您尝试过,并且确实如此,它可能会让生活变得更加轻松。在我的情况下,一旦我从队列中收到消息,消息就是一封准备发送的电子邮件,我只需发送该电子邮件,因此无需与数据库交互。但我必须找到一种跟踪消息id的方法,以检查我是否还没有收到相同的消息,并使用Mongoth以最有效的方式执行此操作消息id肯定是相同的--它在创建消息时由SQS分配,并在SendMessageResponse中实际返回给您。。。这与您每次收到消息时获得的ID相同,因此您可以通过SQS端到端跟踪每条消息。谢谢。将尝试在MongoDB中进行跟踪。我收到一条消息,该消息已成功处理,现在已从队列中删除。是否可以将消息重新发送到同一队列?谢谢你advance@rjohari23请考虑作为单独的问题,附加细节。