文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊聊 Kafka: Consumer 源码解析之 Rebalance 机制

2024-12-02 11:16

关注

如果你是一个有一定经验的程序员,Rebalance 机制我觉得可以作为一道面试题来考察,而且还是有一定难度的。但是也不需要妄自菲薄,跟着老周的这篇文章下来,相信你一定可以拿下它的。

但有些读者确实觉得还是有一定难度,别着急,先看下下面 Kafka 的拓扑结构,这个结构很清晰了吧,如果你对 Kafka 的拓扑结构还不了解,那我建议你先别往下看了,先把 Kafka 的拓扑结构搞清楚,或者先看老周前面的几篇文章再来继续阅读,我觉得效果会更好。

这一篇主要从以下几点来聊一聊 Rebalance 机制:

二、什么是 Rebalance 机制?

Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。

当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制。

从图中可以找到消费组模型的几个概念:

要想实现以上消费组模型,那么就要实现当外部环境变化时,比如主题新增了分区,消费组有新成员加入等情况,实现动态调整以维持以上模型,那么这个工作就会交给 Kafka 重平衡(Rebalance)机制去处理。

从图中可看出,Kafka 重平衡是外部触发导致的,下面来看下触发 Kafka 重平衡的时机有哪些。

三、触发 Rebalance 机制的时机

四、Group 状态变更

4.1 消费端

在 Consumer 侧的门面 ConsumerCoordinator,它继承了 AbstractCoordinator 抽象类。在协调器 AbstractCoordinator 中的内部类 MemberState 中我们可以看到协调器的四种状态,分别是未注册、重分配后没收到响应、重分配后收到响应但还没有收到分配、稳定状态。

上述消费端的四种状态的转换如下图所示:

4.2 服务端

对于 Kafka 服务端的 GroupCoordinator 则有五种状态 Empty、PreparingRebalance、CompletingRebalance、Stable、Dead。他们的状态转换如下图所示:

五、旧版消费者客户端的问题

ConsumerCoordinator 与 GroupCoordinator 的概念是针对 Kafka 0.9.0 版本后的消费者客户端而言的,我们 暂且把 Kafka 0.9.0 版本之前的消费者客户端称为旧版消费者客户端。旧版消费者客户端是使用 Zookeeper 的监听器(Watcher)来实现这些功能的。

每个消费组 在 Zookeeper 中维护了一个 /consumers//ids 路径,在此路径下使用临时节点记录隶属于此消费组的消费者的唯一标识 consumerldString , consumerldString 由消费者启动时创建。消费者的唯一标识由 consumer.id+主机名+时间戳+UUID的部分信息 构成,其中 consumer.id 是旧版消费者客户端中的配置,相当于新版客户端中的 client.id。比如某个消费者的唯一标识为 consumerld_localhost-1510734527562-64b377f5,那么其中 consumerld 为指定的 consumer.id, localhost 为计算机的主机名,1510734527562代表时间戳,而 64b377f5 表示 UUID 的部分信息。

下图与 /consumers//ids 同级的还有两个节点:owners 和 offsets

每个 broker、主题和分区在 Zookeeper 中也都对应一个路径:

每个消费者在启动时都会在 /consumers//ids 和 /brokers/ids 路径上注册一个监听器。当 /consumers//ids 路径下的子节点发生变化时,表示消费组中的消 费者发生了变化;当 /brokers/ids 路径下的子节点发生变化时,表示 broker 出现了增减。这样通过 Zookeeper 所提供的 Watcher,每个消费者就可以监听消费组和 Kafka 集群的状态了。

这种方式下每个消费者对 Zookeeper 的相关路径分别进行监听,当触发再均衡操作时,一个消费组下的所有消费者会同时进行再均衡操作,而消费者之间并不知道彼此操作的结果,这样可能导致 Kafka 工作在一个不正确的状态。与此同时,这种严重依赖于 Zookeeper 集群的做法还有两个比较严重的问题。

六、Rebalance 机制的原理

Kafka 0.9.0 版本后的消费者客户端对此进行了重新设计,将全部消费组分成多个子集,每个消费组的子集在服务端对应一个 GroupCoordinator 对其进行管理,GroupCoordinator 是 Kafka 服务端中用于管理消费组的组件。而消费者客户端中的 ConsumerCoordinator 组件负责与 GroupCoordinator 进行交互。

具体的源码分析,可以看我上一篇分析的 Consumer 如何加入 Consumer Group 文章。

七、Broker 端重平衡场景

7.1 新成员加入

消费者组处于 Stable 之后有新成员加入

7.2 组成员主动离开

7.3 组成员崩溃离开

7.4 Rebalance 时组成员提交 offset

好了,Rebalance 机制就先说这么多了,下一篇会来聊一聊如何避免重平衡。

本文转载自微信公众号「老周聊架构」,可以通过以下二维码关注。转载本文请联系老周聊架构公众号。

来源:老周聊架构内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯