NSA*_*NSA 19 apache-kafka kafka-consumer-api
有人可以告诉我Kafka消费者的再平衡算法是什么吗?我想了解分区计数和消费者线程如何影响这一点.
谢谢,
ser*_*jja 33
好的,目前有2种重新平衡算法 - Range和RoundRobin.它们也称为分区分配策略.
为简单假设我们有一个主题T1与10个分区,我们也有2名消费者提供不同的配置(对于例如更清晰) - C1与num.streams设置为1和C2与num.streams集到2.
以下是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策略的效果:
首先,在实际分配之前必须满足2个条件:
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
此时,所有主题分区都被分配,每个消费者线程每个分区的分区数量几乎相等.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
9409 次 |
| 最近记录: |