先进先出队列中的 AWS SQS 组
AWS SQS groups in FIFO queues
因此,根据 SQS 文档,如果将组 ID 添加到消息中,消费者可以水平扩展。我假设这些组 ID 是动态的。
如果一个consumer最初处理group-id为A
和B
的消息,A的大流量进来,如果没有,B组的消息是否会自动路由到另一个consumer B 类型的消息当前正在传输中?消费者客户端路由是如何确定的,是动态的还是固定的哈希值?例如:如果添加了新的组 ID,是否确保负载在消费者之间均匀分布?
有没有办法获取队列大小的分组计数?
Amazon SQS 中没有"consumer client routing"。
相反,消费者负责向 SQS 队列询问消息。
您有责任适当地扩展和平衡客户端。
For FIFO queues, there can be a maximum of 20,000 inflight messages (received from a queue by a consumer, but not yet deleted from the queue). If you reach this quota, Amazon SQS returns no error messages. If your queue has a large backlog of 20,000 or more messages with the same message group ID, FIFO queues might be unable to return the messages that have a different message group ID but were sent to the queue at a later time until you successfully consume the messages from the backlog.
仅当消息当前为 'being processed' 时才会出现问题。
您的消费者会请求 来自 SQS 的消息。
如果所有消息都被分组,并且消费者从组 A
中获取消息,则来自组 A
的所有其他消息将对其他消费者不可见,直到消息被确认(删除)或达到可见性超时。因此,根据任何其他消费者的请求,他们将收到来自其他可见(未阻止)组的消息 - 在本例中为组 B
(只要队列中组 A
的消息少于 20k ,根据文档)。
注意:在像这样的 FIFO 分组多消费者设置中,我建议不要 prefetching 每个消费者超过 1 条消息。假设您有 10 个预取,并且消费者请求并获得 10 条消息(来自 10 个不同的组,如上所述)。我的理解是,这将阻止该消费者自己的预取“队列”中的所有 10 个组,并破坏多消费者设置。
NB2:如果你想拒绝一条消息(例如,将它发送到deadletter),确保调用ChangeMessageVisibility
将它设置为0,所以它立即被拒绝。否则,SQS 将一直等待,直到达到队列可见性超时,在等待的整个过程中阻塞该组。
因此,根据 SQS 文档,如果将组 ID 添加到消息中,消费者可以水平扩展。我假设这些组 ID 是动态的。
如果一个consumer最初处理group-id为A
和B
的消息,A的大流量进来,如果没有,B组的消息是否会自动路由到另一个consumer B 类型的消息当前正在传输中?消费者客户端路由是如何确定的,是动态的还是固定的哈希值?例如:如果添加了新的组 ID,是否确保负载在消费者之间均匀分布?
有没有办法获取队列大小的分组计数?
Amazon SQS 中没有"consumer client routing"。
相反,消费者负责向 SQS 队列询问消息。
您有责任适当地扩展和平衡客户端。
For FIFO queues, there can be a maximum of 20,000 inflight messages (received from a queue by a consumer, but not yet deleted from the queue). If you reach this quota, Amazon SQS returns no error messages. If your queue has a large backlog of 20,000 or more messages with the same message group ID, FIFO queues might be unable to return the messages that have a different message group ID but were sent to the queue at a later time until you successfully consume the messages from the backlog.
仅当消息当前为 'being processed' 时才会出现问题。
您的消费者会请求 来自 SQS 的消息。
如果所有消息都被分组,并且消费者从组 A
中获取消息,则来自组 A
的所有其他消息将对其他消费者不可见,直到消息被确认(删除)或达到可见性超时。因此,根据任何其他消费者的请求,他们将收到来自其他可见(未阻止)组的消息 - 在本例中为组 B
(只要队列中组 A
的消息少于 20k ,根据文档)。
注意:在像这样的 FIFO 分组多消费者设置中,我建议不要 prefetching 每个消费者超过 1 条消息。假设您有 10 个预取,并且消费者请求并获得 10 条消息(来自 10 个不同的组,如上所述)。我的理解是,这将阻止该消费者自己的预取“队列”中的所有 10 个组,并破坏多消费者设置。
NB2:如果你想拒绝一条消息(例如,将它发送到deadletter),确保调用ChangeMessageVisibility
将它设置为0,所以它立即被拒绝。否则,SQS 将一直等待,直到达到队列可见性超时,在等待的整个过程中阻塞该组。