1. kafka rebalance
rebalance是针对consumer group来说的。consumer group中有多个consumers,当在服务启动阶段,或者新的consumer创建,或者已有consumer宕机,或者parttion变化的情况下会出现rebalance,使得consumers重新分配parittions
如上图,kafka 怎么均匀地分配某个 topic 下的所有 partition 到各个消费者,从而使得消息的消费速度达到最快,这就是平衡(balance)。而 rebalance(重平衡)其实就是重新进行 partition 的分配,从而使得 partition 的分配重新达到平衡状态
2. Reblance 流程:
协调者:
Group Coordinator
是一个服务(比如zookeeper),每个 Broker
在启动的时候都会启动一个该服务。Group Coordinator
的作用是用来存储 Group
的相关 Meta
信息,并将对应 Partition
的 Offset
信息记录到 Kafka。
JoinGroup请求 加入consumer group请求
Join 顾名思义就是加入组。这一步中,所有成员都向coordinator发送JoinGroup请求,请求加入消费组。一旦所有成员都发送了JoinGroup请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader,注意leader和coordinator不是一个概念。leader负责消费分配方案的制定
SyncGroup 请求 分配partition
Join 顾名思义就是加入组。这一步中,所有成员都向coordinator发送JoinGroup请求,请求加入消费组。一旦所有成员都发送了JoinGroup请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader——注意leader和coordinator不是一个概念。leader负责消费分配方案的制定
3. 避免非必要reblance
控制好consumer向协调者发送心跳频率
当 Consumer Group 完成 Rebalance 之后,每个 Consumer 实例都会定期(heartbeat.interval.ms设置)地向 Coordinator 发送心跳请求,表明它还存活着。heartbeat.interval.m这个值设置得越小,Consumer 实例发送心跳请求的频率就越高
控制好consumer从kafka拉数据时间
max.poll.interval.ms 用于控制 Consumer 实际消费能力对 Rebalance 的影响。它限定了 Consumer 端应用程序两次调用 poll 方法的最大时间间隔。它的默认值是 5 分钟,表示你的 Consumer 程序如果在 5 分钟之内无法消费完 poll 方法返回的消息,那么 Consumer 会主动发起 “离开组” 的请求,Coordinator 也会开启新一轮 Rebalance