消费者组rebalance过程中,组内消费者会全部停止消费,直到rebalance结束
影响:
- Rebalance 影响 Consumer 端 TPS。
- 在 Rebalance 期间,Consumer 会停下手头的事情,什么也干不了。
- Rebalance 很慢。
- Rebalance 效率不高。当前 Kafka 的设计机制决定了每次 Rebalance 时,Group 下的所有成员都要参与进来,而且通常不会考虑局部性原理,但局部性原理对提升系统性能是特别重要的
- Rebalance 发生的时机有三个:
- 组成员数量发生变化
- 订阅主题数量发生变化
- 订阅主题的分区数发生变化
- 如何避免rebalance?
我们已经明确了rebalance 可能出现的原因,那么避免出现rebalance的方法也就明确了
- 避免组成员发生变化
避免成员增加,在程序设计之初就规划好具体数量的消费者,是谓瞻前顾后。
避免成员减少,避免消费者进程、线程失活,如果消费者进程与server断开连接,那么消费者组数量也就减少了,会发生rebalance 是谓稳定大于一切
- 避免订阅主题数量发生变化
这个同1,事先规划好要订阅的topic,后期尽量不要变
- 订阅主题的分区数发生变化
这个同1,事先规划好分区数,后期尽量不要变
避免上述三个变化
//consumer失活时间配置
$conf->set("session.timeout.ms",6*1000);
//consumer 心跳频率
$conf->set("heartbeat.interval.ms",2*1000);
//最佳配置 session.timeout.ms >= 3 * heartbeat.interval.ms
避免消费耗时过长导致 进程失活
//设置poll间隔时间
$conf->set("max.poll.interval.ms",420000); 此配置应该大于消费时间
可以参考这个issues
https://github.com/edenhill/librdkafka/issues/1653