【问题标题】:AWS SQS groups in FIFO queuesFIFO 队列中的 AWS SQS 组
【发布时间】:2022-02-25 05:09:20
【问题描述】:

因此,从 SQS 文档中,如果将组 ID 添加到消息中,则可以水平扩展消费者。我假设这些组 ID 是动态的。

如果一个消费者最初正在处理 group-id AB 的消息,并且大量流入 A 进来,如果当前没有 B 类型的消息,是否会自动将组 B 的消息路由到另一个消费者飞行中?消费者客户端路由是如何确定的,是动态的还是固定的散列?例如:如果添加了新的 group-id,是否可以确保负载在消费者之间均匀分布?

有没有办法获得队列大小的分组计数?

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案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 但被发送到队列的消息稍后,直到您成功使用积压中的消息。

    仅当消息当前“正在处理”时才会出现问题。

    【讨论】:

    • 那么,如果我们只是将多个消费者添加到队列中,将提供来自任何组的消息?例如:违反消息组顺序?
    • 检查这个:docs.aws.amazon.com/AWSSimpleQueueService/latest/… 这个文档说 groupID 将分布在消费者之间(乐观地)。
    • 我修正了我的回复。接收消息时,您不能请求特定的MessageGroupId。相反,将返回队列中的第一条消息除非当前正在处理具有相同MessageGroupId 的消息。如果处理失败,“飞行中”消息可能会返回到队列中,因此在该消息完成处理之前,无法处理具有相同MessageGroupId 的另一条消息。因此,它将为您提供队列中没有正在处理的MessageGroupId 的第一条消息。
    • 所以在我的示例中,类型 B 的消息将被路由到其他消费者对吗?
    • 消息不会“路由到消费者”。相反,消费者请求消息。如果一个消费者当前正在处理来自消息组 A 的某些内容,那么下一个消息请求将提供来自消息组 B 的消息。
    【解决方案2】:

    您的消费者将从 SQS 请求消息。

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

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

    NB2:如果您想拒绝一条消息(例如,将其发送到死信),请务必调用ChangeMessageVisibility 将其设置为0,这样它就会立即被拒绝。如果不是,SQS 将一直等待,直到达到队列可见性超时,并在等待的整个过程中阻塞该组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-12
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      相关资源
      最近更新 更多