重平衡的完整流程需要消费者 端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。在消费者端,重平衡分为两个步骤:分别是加入组和等待领导者消费者(Leader Consumer)分配方案。这两个步骤分别对应两类特定的请求:JoinGroup 请求和 SyncGroup 请求。
当组内成员加入组时,它会向协调者发送 JoinGroup 请求。在该请求中,每个成员都要将 自己订阅的主题上报,这样协调者就能收集到所有成员的订阅信息。一旦收集了全部成员的 JoinGroup 请求后,协调者会从这些成员中选择一个担任这个消费者组的领导者。
通常情况下,第一个发送 JoinGroup 请求的成员自动成为领导者。你一定要注意区分这里 的领导者和之前我们介绍的领导者副本,它们不是一个概念。这里的领导者是具体的消费者 实例,它既不是副本,也不是协调者。领导者消费者的任务是收集所有成员的订阅信息,然 后根据这些信息,制定具体的分区消费分配方案。
选出领导者之后,协调者会把消费者组订阅信息封装进 JoinGroup 请求的响应体中,然后 发给领导者,由领导者统一做出分配方案后,进入到下一步:发送 SyncGroup 请求。
在这一步中,领导者向协调者发送 SyncGroup 请求,将刚刚做出的分配方案发给协调者。 值得注意的是,其他成员也会向协调者发送 SyncGroup 请求,只不过请求体中并没有实际 的内容。这一步的主要目的是让协调者接收分配方案,然后统一以 SyncGroup 响应的方式 分发给所有成员,这样组内所有成员就都知道自己该消费哪些分区了。
接下来,我用一张图来形象地说明一下 JoinGroup 请求的处理过程。
就像前面说的,JoinGroup 请求的主要作用是将组成员订阅信息发送给领导者消费者,待 领导者制定好分配方案后,重平衡流程进入到 SyncGroup 请求阶段。
下面这张图描述的是 SyncGroup 请求的处理流程。
推荐阅读
业务幂等性技术架构体系
责任链模式实践-开放银行数据保护及合规
Kafka 中幂等生产者和事务生产者是一回事吗-CSDN博客