SQS真的为每条消息发送多个S3 PUT对象记录吗



我已经设置了一个S3 bucket来向SQS发出PUT对象上的事件,并且我正在EB工作层中处理SQS队列。

SQS发送的消息的模式如下:http://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html

Records是一个数组,这意味着在一次POST中可以有多个记录发送到我的工作人员的端点。这真的发生了吗?或者我的员工每条消息只会收到一条记录?

工作者只能返回一个响应,200(消息处理成功)或非200(消息未处理成功,这会将其重新放入队列),而不管它在消息中接收到多少条记录。

因此,如果我的工作人员在一条消息中接收到多条记录,并且它成功地处理了一些记录(比如说,通过做一些有副作用的事情,比如插入数据库),但在一条或多条记录上失败了,我该如何处理?如果我返回200,那么失败的将不会重试。但如果我返回non-200,那么成功处理的那些将被不必要地重试,并且可能被重新插入。因此,我必须让我的员工足够聪明,只重试失败的部分——这是我不想写的逻辑。

如果每条消息只发送一条记录,这会容易得多。所以,如果在实践中是这样的话,尽管记录是一个数组,但我真的很想知道!

要明确的是;SQS发送"这是S3发送到SQS(或发送到SNS或发送到Lambda)的记录。

目前,所有S3事件通知每个通知消息都有一个事件。在将来添加新的事件类型时,我们可能会包含多个记录。这也是一种在其他AWS服务之间共享的消息格式,其他服务可以包括多个记录。

--https://forums.aws.amazon.com/thread.jspa?messageID=592264&592264

因此,目前,每条消息似乎只有一条记录。

但是。。。如果您认为您的应用程序不需要准备好处理重复或重复的消息,那么您就犯了一个错误。在任何像SQS这样的大规模分布式系统中,无论这种情况多么不可能发生,都很难绝对保证:

Q: 每条信息我会收到多少次?

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

--http://aws.amazon.com/sqs/faqs/

顺便说一句,在我的平台中,记录数组中的多个条目被认为是错误,导致消息被放弃并发送到死信队列进行审查。

最新更新