FIFO队列中的AWS SQS组

时间:2020-06-15 17:52:52

标签: amazon-sqs

因此,如果将group -id添加到消息中,则可以从SQS文档中水平缩放使用者。我认为这些组ID是动态的。

如果某个使用者最初正在处理组ID为AB的消息,并且大量流入A,那么如果没有以下消息,则B组的消息会自动路由到另一个使用者B型飞机目前正在飞行中?消费者客户端路由如何确定,是动态的还是固定的哈希?例如:如果添加了新的组ID,是否可以确保负载在消费者之间平均分配?

是否可以获取队列大小的分组计数?

2 个答案:

答案 0 :(得分:1)

Amazon SQS中没有“消费者客户端路由”。

相反,消费者负责向SQS队列询问消息。

适当地扩展和平衡客户是您的责任。

来自Avoid having a large backlog of messages with the same message group ID - Amazon Simple Queue Service

对于FIFO队列,最多可以有20,000个运行中消息(使用者从队列中接收到但尚未从队列中删除)。如果达到此配额,Amazon SQS将不返回错误消息。如果您的队列积压了大量的20,000个或更多具有相同消息组ID的消息,则FIFO队列可能无法返回具有不同消息组ID但已通过以下方式发送到队列的消息:直到您成功使用了积压的邮件。

这仅是当前正在“处理”消息的问题。

答案 1 :(得分:1)

是您的消费者请求来自 SQS 的消息。

如果所有消息都被分组,并且消费者从组 A 中获取一条消息,那么来自组 A 的所有其他消息将对其他消费者不可见,直到消息被确认(删除) 或达到可见性超时。因此,根据任何其他消费者的请求,他们将收到来自其他可见(未阻止)组的消息 - 在这种情况下,组 B(只要队列中组 A 的消息少于 20k ,根据文档)。

注意:在像这样的 FIFO 分组多消费者设置中,我建议不要预取每个消费者超过 1 条消息。假设您有 10 条预取,一个消费者请求并获取 10 条消息(来自 10 个不同的组,如上所述)。我的理解是,这会阻塞该消费者自己的预取“队列”中的所有 10 个组,并破坏多消费者设置。

NB2:如果您想拒绝一条消息(例如,将其发送到死信),请确保调用 ChangeMessageVisibility 将其设置为 0,以便立即拒绝。如果没有,SQS 将一直等待,直到达到队列可见性超时,并在等待的整个时间段内阻塞该组。