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

Does SQS really send multiple S3 PUT object records per message?

我已经设置了一个 S3 存储桶以将 PUT 对象上的事件发送到 SQS,并且我正在 EB 工作层中处理 SQS 队列。

SQS 发送的消息的架构在这里:http://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html

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

工作人员只能return一个响应,200(消息处理成功)或非200(消息未成功处理,将其放回队列),无论有多少条记录它收到的消息。

因此,如果我的工作人员在一条消息中收到多条记录,它成功处理了一些记录(比如通过执行一些有副作用的操作,例如插入数据库)但在一条或多条记录上失败了,我应该如何处理?如果我return200,那么失败的不会重试。但如果我 return 非 200,那么处理成功的将不必要地重试,并可能重新插入。所以我必须让我的工作人员足够聪明,只重试失败的——这是我不想写的逻辑。

如果每条消息只发送一条记录,这会容易得多。因此,如果实际上是这样,尽管记录是一个数组,但我真的很想知道!

需要说明的是,“SQS 发送”不是记录。这是 S3 发送到 SQS(或 SNS,或 Lambda)的记录。

Currently, all S3 event notifications have a single event per notification message. We might include multiple records as we add new event types in the future. This is also a message format that is shared across other AWS services, and other services can include multiple records.

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

因此,目前看来每条消息只有一条记录。

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

Q: How many times will I receive each message?

Amazon SQS is engineered to provide “at least once” delivery of all messages in its queues. Although most of the time each message will be delivered to your application exactly once, you should design your system so that processing a message more than once does not create any errors or inconsistencies.

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

顺便说一句,在我的平台中,记录数组中的多个条目被视为错误,导致消息被放弃并发送到 dead letter queue 进行审核。