我已经设置了一个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/
顺便说一句,在我的平台中,记录数组中的多个条目被认为是错误,导致消息被放弃并发送到死信队列进行审查。