卡夫卡消费者再平衡算法



有人能告诉我卡夫卡消费者的再平衡算法是什么吗?我想了解分区计数和使用者线程是如何影响这一点的。

谢谢你,

好的,所以目前有两种再平衡算法——RangeRoundRobin。它们也被称为分区分配策略。

为了简单起见,假设我们有一个具有10个分区的主题T1,并且我们还有两个具有不同配置的消费者(为了示例更清晰)——C1,其中num.streams设置为1C2,其中num.streams设置为2

以下是如何使用Range策略:

Range按数字顺序排列可用分区,按字典顺序排列使用者线程。因此,在我们的情况下,分区的顺序将是0, 1, 2, 3, 4, 5, 6, 7, 8, 9,使用者线程的顺序将为C1-0, C2-0, C2-1。然后将分区的数量除以使用者线程的数量,以确定每个使用者线程应该拥有多少分区。在我们的例子中,它不是等分的,所以线程C1-0将获得一个额外的分区。最后的分区分配如下所示:

C1-0获取分区0, 1, 2, 3
C2-0获取分区4, 5, 6
C2-1获取分区7, 8, 9

如果有11个分区,那么这些消费者的分区分配将发生一些变化:

C1-0将获得分区0, 1, 2, 3
C2-0将获得分区4, 5, 6, 7
C2-1将获得分区8, 9, 10

就是这样。

相同的配置不适用于RoundRobin策略,因为它要求订阅该主题的所有消费者都有相同的num.streams,所以假设两个消费者现在都将num.streams设置为2。与Range策略相比,这里的一个主要区别是,在重新平衡之前,您无法预测任务会是什么。以下是如何使用RoundRobin策略:

首先,在实际分配之前必须满足两个条件:

a) 每个主题在使用者实例中都有相同数量的流(这就是为什么我上面提到每个使用者不同数量的线程是不起作用的)
b) 对于组中的每个使用者实例,订阅的主题集都是相同的(我们这里有一个主题,所以现在这不是问题)。

当这两个条件被验证时,topic-partition对通过散列码进行排序,以减少一个主题的所有分区被分配给一个消费者的可能性(如果有多个主题要被消费)。

最后,所有topic-partition对都以循环方式分配给可用的使用者线程。例如,如果我们的主题分区最终排序为:T1-5, T1-3, T1-0, T1-8, T1-2, T1-1, T1-4, T1-7, T1-6, T1-9,使用者线程为C1-0, C1-1, C2-0, C2-1,那么分配将为:

T1-5转到C1-0
T1-3转到C1-1
T1-0转到C2-0
T1-8转到C2-1
在这一点上,没有留下更多的使用者线程,但仍然有更多的主题分区,因此使用者线程的迭代重新开始:
T1-2转到C1-0
T1-1转到C1-1
T1-4转到C2-0
T1-7转到C2-1
再次:
T1-6转到C1-0
T1-9转到C1-1

此时,所有主题分区都已分配,每个使用者线程的分区数几乎相等。

希望这能有所帮助。

您可以阅读以下Kafka文档http://kafka.apache.org/documentation/#impl_brokerregistration关于消费者注册算法和消费者再平衡算法

正如它所说,每个消费者在再平衡过程中都会做以下事情:

1. For each topic T that C<sub>i</sub> subscribes to
2.   let P<sub>T</sub> be all partitions producing topic T
3.   let C<sub>G</sub> be all consumers in the same group as C<sub>i</sub> that consume topic T
4.   sort P<sub>T</sub> (so partitions on the same broker are clustered together)
5.   sort C<sub>G</sub>
6.   let i be the index position of C<sub>i</sub> in C<sub>G</sub> and let N = size(P<sub>T</sub>)/size(C<sub>G</sub>)
7.   assign partitions from i*N to (i+1)*N - 1 to consumer C<sub>i</sub>
8.   remove current entries owned by C<sub>i</sub> from the partition owner registry
9.   add newly assigned partitions to the partition owner registry
    (we may need to re-try this until the original partition owner releases its ownership)

还要注意:

如果消费者比分区多,那么一些消费者将根本得不到任何数据。在重新平衡过程中,我们试图以减少每个消费者必须连接的代理节点数量的方式将分区分配给消费者

最新更新