Rebalance总览
Rebalance触发条件
(1)消费组成员发生变更,有新消费者加入或者离开,或者有消费者崩溃
(2)消费者组订阅的主题数量发生变更
(3)消费组订阅主题的分区数发生变更
避免不必要的Rebalance
针对(1)中消费者崩溃问题,有时候是Consumer没有在配置的制定时间内完成消息的处理,Coordinator就认为该Consumer已经"崩溃",引发新一轮的Rebalance
可调优参数:
session.timeout.ms:该配置定义了消费者与Kafka集群之间的会话超时时间,如果在这个时间内未发送心跳包到集群服务器,服务器就会将其标记未离线并触发Rebalance
heartbeat.interval.ms:配置心跳包发送的频率,如果session配置6s hearbeat配置2s,那么至少能够保证三轮的心跳请求
max.poll.interval.ms:消费者是通过poll()方法来拉取消息,这个配置定义了两次poll之间的间隔,如果消费者处理数据量非常大超过了max.poll.interval.ms仍没有继续拉取,就会触发Rebalance
Group Coordinator职能
四大类:Coordinator/Group/Offset/Heartbeat
ApiKeys.Find_coordinator
ApiKeys.Join_Group
Apikeys.Leave_Group
Apikeys.Sync_group
Apikeys.Offset_commmit
Apikeys.Offset_Fetch
Apikeys.Offset_for_leader_epoch
Apikeys.Offset_delete
Apikeys.Heartbeat
(1)负责管理消费者组的分区分配信息和Offset,存储消费者组成员元数据,分配GroupID和ConsumerID
(2)负责处理JoinGroupRequest和SyncGroupRequest完成分区分配的工作
(3)通过心跳检查消费者的状态
Consumer Group状态机
分区分配策略
RangeAssignor(默认)、RoundRobinAssignor、StickyAssignor
RangeAssignor:按照+Topic+的维度进行分配的,对于每个Topic,首先对Partition按照分区ID进行排序,然后对订阅这个Topic的ConsumerGroup的Consumer再进行排序,之后尽量均衡的按照范围区段将分区分配给Consumer
RoundRobinAssignor:将 Consumer Group 内订阅的所有 Topic 的 Partition 及所有 Consumer 进行排序后按照顺序尽量均衡的一个一个进行分配。如果 Consumer Group 内,每个 Consumer 订阅都订阅了相同的Topic,那么分配结果是均衡的。如果订阅 Topic 是不同的,那么分配结果是不保证"尽量均衡"的,因为某些 Consumer 可能不参与一些 Topic 的分配
StickyAssignor:可通过partition.assignment.strategy参数配置,发生Rebalance时尽量与上一次分配的结果保持一致
RangeAssignor图解
RoundRobinAssignor图解
组内订阅Topic相同
组内订阅Topic不同
StickyAssignor图解