这就叫公平的分配策略。
举个简单的例子来说明一下Consumer Group发生Rebalance的过程。
假设目前某个Consumer Group下有两个Consumer,比如A和B,当第三个成员C加入时,Kafka会触发Rebalance,并根据默认的分配策略重新为A、B和C分配分区
Rebalance之后的分配依然是公平的,即每个Consumer实例都获得了2个分区的消费权。
在Rebalance过程中,所有Consumer实例都会停止消费,等待Rebalance完成,这是Rebalance为人诟病的一个方面。
目前Rebalance的设计是所有Consumer实例共同参与,全部重新分配所有分区。
「Coordinator会在什么情况下认为某个Consumer实例已挂从而要退组呢?」
当Consumer Group完成Rebalance之后,每个Consumer实例都会定期地向Coordinator发送心跳请求,表明它还存活着。
如果某个Consumer实例不能及时地发送这些心跳请求,Coordinator就会认为该Consumer已经死了,从而将其从Group中移除,然后开启新一轮Rebalance。
Consumer端有个参数,叫**session.timeout.ms(默认10s)
**。
该参数的默认值是10秒,即如果Coordinator在10秒之内没有收到Group下某Consumer实例的心跳,它就会认为这个Consumer实例已经挂了。
除了这个参数,Consumer还提供了一个允许你控制发送心跳请求频率的参数,就是**heartbeat.interval.ms(默认3sÿ