✅什么是Kafka的渐进式重平衡?
典型回答
重平衡的问题大家都知道,他会导致STW,所以大家都不希望他发生,或者希望他能把影响降到最低。
然后有一种优化方案是渐进式重平衡,目的是在进行消费者组重平衡时,尽可能减少数据中断和不必要的分区变更。它由 Cooperative Sticky Assignor提供支持,并在 Kafka 2.4.0 引入。
开启方式:
props.put("partition.assignment.strategy",
"org.apache.kafka.clients.consumer.CooperativeStickyAssignor");开启了CooperativeStickyAssignor之后,Kafka 通过 两阶段分配 机制实现渐进式重平衡,下面举个例子,假设有一个topic,共6个partition,一个消费者,其中有两个消费者再消费数据:

这时候有一个新的消费者加入,就需要重平衡。
如果是传统重平衡方式,Kafka 会:
- 让 ConsumerA 和 ConsumerB 释放所有分区(完全停止消费)。
- Kafka 重新分配 P0 ~ P5 给 ConsumerA、ConsumerB、ConsumerC。
- 消费者重新开始消费(期间完全中断)

而如果是渐进式重平衡,则采用2阶段方式。
第一阶段:部分撤销
- ConsumerA 和 ConsumerB 不会释放所有分区,而是部分释放。
- Kafka 计算 最小变更 方案,并决定 ConsumerA、ConsumerB 各释放一个分区,给 ConsumerC 用。即可能是ConsumerA 释放 Partition-2;ConsumerB 释放 Partition-5

第二阶段:重新分配
- Kafka 重新分配被释放的分区,则 ConsumerC 消费 Partition-2 和 Partition-5

这么样的重平衡过程,就可以减少所有分区都停止消费的情况,而只有其中部分分区需要重新分配而已。以上使用增加消费者的方式距离的,如果是减少消费者其实也一样。只有移除的消费者释放自己的分区,再重新分配给其他分区就好了,其他分区自己的那部分不用改变。