本文主要讨论Kafka新版本reblance机制的优缺点,经过这篇文章,你能够了解到如下内容:微信
什么是Reblancefetch
Reblance过程优化
Kafka1.1对Reblance的优化
线程
Kafka2.3对Reblance的优化orm
新版本Reblance存在的问题cdn
Reblance是Kafka协调者把partition分配给Consumer-group下每一个consumer实例的过程blog
在执行Reblance期间,Group内的全部Consumer没法消费消息。所以频繁的Reblance会下降消费系统的TPS。同步
一般在如下状况,会出发Reblance:it
组订阅topic数变动io
topic partition数变动
consumer成员变动
consumer 加入群组或者离开群组的时候
consumer被检测为崩溃的时候
Kafka Reblance是经过协调者Coordnator实现的:
consumer经过fetch线程拉消息(单线程)
consumer经过心跳线程来与broker发送心跳。超时会认为挂掉
每一个consumer group在broker上都有一个coordnator来管理,消费者加入和退
若是心跳线程在timeout时间内没和broker发送心跳,coordnator会认为该group应该进行reblance。接下来其余consumer发来fetch请求后,coordnator将回复它们进行reblance准备。当consumer成员收到请求后,发送response给coordnator。其中只有leader的response中才包含分配策略。在consumer的下次请求到来时,coordnator会把分配策略同步给各consumer
存在的问题
经过延迟进入PreparingRebalance状态减小reblance次数
咱们系统的一个Group一般包含成百consumer,为防止服务启动时,这些consumer不断加入引发频繁的reblance,Kafka新增了延迟reblance机制。即从初始状态到准备Reblance前,先进入InitialReblance状态,等待一段时间(group.initial.rebalance.delay.ms)让其余consumer到来后再一块儿执行reblance,从而下降其频率。
以上解决了服务启动时,consumer陆续加入引发的频繁Reblance,但对于运行过程当中,consumer超时或重启引发的reblance则没法避免,其中一个缘由就是,consumer重启后,它的身份标识会变。简单说就是Kafka不确认新加入的consumer是不是以前挂掉的那个。
在Kafka2.0中引入了静态成员ID,使得consumer从新加入时,能够保持旧的标识,这样Kafka就知道以前挂掉的consumer又恢复了,从而不须要Reblance。这样作的好处有两个:
下降了Kafka Reblance的频率
即便发生Reblance,Kafka尽可能让其余consumer保持原有的partition,减小了重分配引来的耗时、幂等等问题
目前系统把每一个上游的业务线抽象成一个topic,假设他们partition分别是十、20、40、80,咱们的80台机器每每是分批次灰度发布。这样全量发布完,只有80个partition的topic才会被每台机器所占有,而其余topic的partition只能被先启动的那批consumer抢占到,这样就形成了分配不均匀;因为粘性reblance的存在,下次reblance,大部分consumer依旧占有以前partition,就形成了长久的分配不均匀。以前想过,配置每台机器启动那部分topic的consumer,但会强依赖IP,在容器化的趋势下,显然是不划算的。
长按订阅更多精彩▼
若有收获,点个在看,诚挚感谢