什么是协调器协调器是用于协调多个消费者之间可能正确地工作的一个角色, 比方计算生产的分区调配策略,又或者消费者的退出组与来到组的解决逻辑, 有一点相似Kafka种的控制器的角色。协调器的作用协调器分为 生产组协调器 和 消费者协调器两种
生产组协调器组协调器(GroupCoordinator)能够了解为各个消费者协调器的一个中央处理器, 每个消费者的所有交互都是和组协调器(GroupCoordinator)进行的。
选举Leader消费者客户端解决申请加入组的客户端再均衡后同步新的调配计划保护与客户端的心跳检测治理消费者已生产偏移量,并存储至__consumer_offset中消费者协调器每个客户端都会有一个消费者协调器, 他的次要作用就是向组协调器发动申请做交互, 以及解决回调逻辑
向组协调器发动入组申请向组协调器发动同步组申请(如果是Leader客户端,则还会计算调配策略数据放到入参传入)发动离组申请放弃跟组协调器的心跳线程向组协调器发送提交已生产偏移量的申请协调器运行流程组协调器抉择逻辑生产组协调器的抉择kafka上的组协调器(GroupCoordinator)协调器有很多, 跟Controller不一样的是, Controller只有一个, 而组协调器(GroupCoordinator)是依据外部Topic __consumer_offset数量决定的,有多少个 __consumer_offset分区, 那么就有多少个组协调器(GroupCoordinator)。
然而每个分区可能有多个正本, 那么每个组协调器应该调配在哪里呢?
每个__consumer_offset分区的Leader正本在哪个Broer上, 那么对应协调器就在哪里。
具体请看:寻找协调器FindCoordinatorRequest申请流程
如何确定每个生产组对应哪个协调器默认状况下, __consumer_offset有50个分区, 每个生产组都会对应其中的一个分区,对应的逻辑为 hash(group.id)%分区数;
消费者退出组流程JoinGroup客户端启动的时候, 或者重连的时候会发动JoinGroup的申请来申请加入的组中。
JoinGroup时序图
消费者客户端发动第一次申请, 协调器给它计算一个MemberId返回消费者客户端发动第二次申请,MemberId是刚刚失去的。生产组协调器解决申请,构建新的MemberMetadata元信息缓存到Group中。生产组协调器将状态流转为 PreparingRebalance初始化Generation数据,比方generationId+1, Group状态流转为 CompletingRebalance,当然如果以后Group的member是空的,则流转为 Empty ;将下面的数据组装一下为JoinGroupResult,返回给所有的Member, 当然如果是Leader Member的话, 还会额定给他所有Member的元信息(因为它要用这些数据去计算新的分区调配的数据。)消费者客户端拿到数据之后, 像生产组协调器发动SyncGroupRequest的申请, 如果是Leader Member的话, 则会依据分区策略去计算一下新的调配策略,并把数据带上发动SyncGroupRequest的申请。对于SyncGroupRequest请看: Kafka消费者 SyncGroupRequest 流程解析详情请看:Kafka消费者JoinGroupRequest流程解析
组协调器同步流程SyncGroup以后客户端都曾经实现JoinGroup之后, 客户端会收到JoinGroup的回调, 而后客户端会再次向组协调器发动SyncGroup的申请来获取新的调配计划。
然而在这一个过程中,新的调配计划是由Leader 客户端计算出来的,并且会同步给组协调器。
而后组协调器再把这些后果回调给泛滥客户端。
消费者离组流程LeaveGroup当消费者客户端关机/异样 时, 会触发离组LeaveGroup申请。
组协调器始终会有针对每个客户端的心跳检测, 如果监测失败,则就会将这个客户端踢出Group、
这个提出的流程也很简略
就是触发一下 再均衡。
心跳检测客户端退出组内后, 会始终放弃一个心跳线程,来放弃跟组协调器的一个感知。
并且组协调器会针对每个退出组的客户端做一个心跳监测,如果监测到过期, 则会将其踢出组内并再均衡。
分区调配策略Q&A1. 如果有多个客户端配置了不同的调配策略, 那么会以哪个配置失效呢?
必定是须要生产组上面的所有成员都应用同一种调配策略来进行调配。所以GroupCoordinator就面临着抉择哪个调配策略。
抉择的逻辑如下
抉择所有Member都反对的调配策略在1的根底上,优先选择每个partition.assignment.strategy配置靠前的策略。请看上面的2个例子
Case-1
所有反对的调配策略为:roundrobin,rang每个consumer都在1的根底上,给本人排最后面的投票, consumer-0投roundrobin, consumer-1投rang, consumer-3投roundrobin;这样算下来 roundrobin是有2票的, 那么久抉择roundrobin为调配策略;Case-2
...