分区分配
分区再均衡在服务端由GroupCoordinator负责,在客户端由ConsumerCoordinator负责,集群的全部消费组划分为多个子集,每个消费组的子集在服务端对应一个GroupCoordinator
有以下几种情况会触发再均衡
1.新消费者加入
2.消费者被动下线
3.消费者主动下线
4.消费组对应的GroupCoordinator节点发生变更
5.消费组订阅的主题分区数量发生变化
当发生分区再均衡时有以下几个阶段
第一阶段 FIND_COORDINATOR
消费者需要确定他所属的消费组对应的GroupCoordinator所在的broker,并与该broker建立连接.消费者通过FindCoordinatorRequest请求对应的GroupCoordinator
第二阶段JOIN_GROUP
找到自己所属的GroupCoordinator之后,会向GroupCoordinator发送JoinGroupRequest请求
GroupCoordinator的任务
1.选举消费组的leader,基本上是第一个加入消费组的消费者或者随便选一个作为leader
2.选举分区分配策略:根据每个消费者提交的各自的分配策略中找一个满足所有消费者需求的分配策略
3.选出分区策略后会发送JoinGroupResponse给各个消费者,leader和普通消费者消息有些差别
第三阶段SYNC_GROUP
leader消费者根据分区分配策略执行具体的分区分配方案(所以客户端可以自定义分配策略),这个方案里包含每个消费者消费那个TopicPartition,之后发送SyncGroupRequest请求,把分配方案提交给GroupCoordinator,GroupCoordinator将分配方案和消费组的元数据存入__consumer_offsets,最后将分配方案返回给各个消费者,之后消费者和GroupCoordinator会保持心跳连接
第四阶段HEARTBEAT
经历前三阶段,消费者可以进入消费状态.首先消费者需要确定自己拉取消息的起始位置,或者消费者指定,或者由上次提交的offset开始消费(消费者通过OffsetFetchRequest获得上次提交的位移)
正常消费开始后,消费者提交offset,同时发送心跳
如果超时未收到心跳,GroupCoordinator开始分区再均衡