跳到主要内容

分区再平衡

分区再平衡是指事件代理更新分区队列的分区到流程映射的过程。再平衡涉及重新分配分区到流程的映射,以便流程在所有分区中均匀分布,每个分区分配给单个流程(但请注意,一个流程可以分配给多个分区)。

如果所有活动消费者流程被分配到相同数量的分区(加减一个),则认为分区队列是平衡的。

以下更改会触发再平衡:

  • 队列的操作分区计数发生变化。如果分区计数增加或减少,或者父队列的访问类型从独占变为非独占,都会发生这种情况。代理在完成分区扩展过程后触发再平衡。

  • 有新消费者绑定到分区数少于消费者数的分区队列。如果已经有过多的消费者,新的消费者绑定不会触发再平衡。

  • 消费者从没有过多消费者的分区队列解绑。如果有过多的消费者,其中一个立即变为活动状态,并接管最近解绑消费者的负载。

客户端应用程序发出的解绑信号与因断开连接导致的解绑之间没有区别。

分区队列具有以下属性:

  • 分区计数 - 分区的数量。分区编号从0到N-1,其中N是分区的数量(一个有四个分区的队列的分区编号从0到3)。

  • 再平衡延迟 - 在触发再平衡活动之前,允许消费者数量稳定下来的延迟时间,以秒为单位。 如果在延迟计时器到期之前消费者数量恢复到之前的状态,则不会发生分区交接。

    在自动扩展场景中,这指定了第一个和最后一个消费者实例更改之间的最大延迟。

    如果分区计数发生变化,再平衡会立即开始。

  • 再平衡最大交接时间 - 代理在分区交接期间等待消费者确认未完成消息的最大秒数。

再平衡过程解决分区队列的以下属性差异:

  • 为队列配置的分区计数
  • 当前分区集
  • 每个分配给它一个或多个分区的活动消费者流程集

当再平衡开始时,一些映射可能不完整:

  • 分区可能未分配给流程(如果由于分区计数增加而创建了新分区)
  • 一个或多个流程可能暂时映射到无效分区(如果由于分区计数减少刚刚删除了分区,或者消费者刚刚断开连接),或根本没有映射到分区(如果刚刚添加了新消费者)

再平衡不考虑队列深度或任何其他队列或流程指标。

为了平衡队列的分区,事件代理执行以下步骤:

  1. 处理分区数量的任何变化(根据需要删除或创建分区)。

  2. 将任何新分区映射到消费者流程,优先考虑已经映射的分区数量最少的流程。

  3. 向其所有分区都已删除的流程发送FlowChangeUpdate(移除ActiveFlow指示器)。如果只删除了部分分配给它的分区,则流程保持活动状态。

  4. 检查平衡。如果所有流程分配的分区数量相同(加减一个),则已实现平衡。

  5. 如果分区不平衡,将分区从一个流程交接给另一个流程,从分配分区数量最多的流程交接给分配分区数量最少的流程。

  6. 重复步骤1至步骤6,直到实现平衡。

例如,考虑下图。我们从一个有七个分区和三个绑定流程的分区队列开始。

img

在平衡状态下,每个消费者流程要么有两个要么有三个映射的分区。

假设另一个消费者上线,如下一个图所示:

img

这个队列现在有七个分区和四个消费者流程。它是不平衡的,因为不是所有流程都有相同数量(加减一个)的分区分配给它们。在这里,新流程没有分区,而其他流程要么有两个要么有三个。

再平衡后,结果队列有三个流程,每个流程有两个分区,一个流程有一个分区,如下所示。

img

分区再平衡状态

分区队列可以具有以下再平衡状态之一:

  • 就绪 - 尚未触发再平衡活动。

  • 保持 - 在队列的再平衡延迟属性指定的延迟后开始再平衡活动。

  • 再平衡 - 正在进行再平衡逻辑以调整分区到流程的映射。