在一个批次中包含多个相同组的SQS消息

0

【以下的问题经过翻译处理】 我在一个单个接收请求中以最大消息数设置为2的方式从同一SQS FIFO组中获取多个消息。这是正确的行为吗?我不理解,API里说明:

当从具有多个消息组ID的FIFO队列接收消息时,Amazon SQS首先尝试返回尽可能多的具有相同消息组ID的消息。这允许其他用户处理具有不同消息组ID的消息。当您收到具有消息组ID的消息时,除非删除消息或消息变为可见,否则不会返回同一消息组ID的更多消息

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues-understanding-logic.html

我的代码直接将消息分派给工作程序,没有任何组检查逻辑。看起来我要么需要实现这样的功能,要么就要让所有 SQS 接收请求的 maxMessages 设置为 1,这听起来像是在浪费资源。我感到困惑,因为在上面提到的文件页面上,有以下信息:

可以使用ReceiveMessage操作的MaxNumberOfMessages请求参数在单个调用中接收最多10条消息。这些消息保留其FIFO顺序,并且可以具有相同的消息组ID

这违反了上述合同,该合同字面上说:“除非删除消息或消息变为可见”。在我的测试中,我立即在单个接收调用中看到这些消息返回,但它们设置为30秒过期。我不明白,是否有某种日志可以告诉我为什么消息发送得那么快?我可能在这里漏了什么。

profile picture
专家
已提问 5 个月前3 查看次数
1 回答
0

【以下的回答经过翻译处理】 这就是它应该工作的方式。SQS FIFO维护具有相同组ID的所有消息的顺序。为确保顺序被保留,如果一个消费者获取了具有特定组ID的消息,则其他消费者将无法获取该ID的消息,直到消息被删除或再次变为可见状态。否则,消息可能会以无序的方式被处理。

没有什么可以阻止单个消费者获取同一组ID的多条消息,因为消费者可以知道这些消息的顺序(在数组中的顺序),并且可以按顺序处理它们。

如果您的代码以异步方式发送要处理的消息,则会破坏顺序。您应该一次处理一条消息。为了更快地处理消息,您应该拥有多个消费者,每个消费者将从不同的组ID获取消息,这样就可以保持顺序并更快地处理消息。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则