因此,如果将group -id添加到消息中,则可以从SQS文档中水平缩放使用者。我认为这些组ID是动态的。
如果某个使用者最初正在处理组ID为A
和B
的消息,并且大量流入A,那么如果没有以下消息,则B组的消息会自动路由到另一个使用者B型飞机目前正在飞行中?消费者客户端路由如何确定,是动态的还是固定的哈希?例如:如果添加了新的组ID,是否可以确保负载在消费者之间平均分配?
是否可以获取队列大小的分组计数?
答案 0 :(得分:1)
Amazon SQS中没有“消费者客户端路由”。
相反,消费者负责向SQS队列询问消息。
适当地扩展和平衡客户是您的责任。
对于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 将一直等待,直到达到队列可见性超时,并在等待的整个时间段内阻塞该组。