Kafka 核心技术与实战
胡夕
Apache Kafka Committer,老虎证券技术总监
52815 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
结束语 (1讲)
Kafka 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

25 | 消费者组重平衡全流程解析

等待一段时间才能感知到
LeaveGroup请求
通过心跳请求响应通知组内成员
SyncGroup请求
JoinGroup请求
控制重平衡通知的频率
通过心跳线程完成
允许部分消费者在重平衡过程中继续消费
改进重平衡过程
重平衡时协调者对组内成员提交位移的处理
组成员崩溃离组
组成员主动离组
新成员加入组
等待领导者消费者分配方案
加入组
Stable
CompletingRebalance
PreparingRebalance
Dead
Empty
重平衡的通知机制
订阅主题的分区数发生变化
订阅主题数量发生变化
组成员数量发生变化
开放讨论
协调者端重平衡场景剖析
消费者端重平衡流程
消费者组状态机
触发与通知
Kafka消费者组重平衡的全流程解析

该思维导图由 AI 生成,仅供参考

你好,我是胡夕。今天我要和你分享的主题是:消费者组重平衡全流程解析。
之前我们聊到过消费者组的重平衡流程,它的作用是让组内所有的消费者实例就消费哪些主题分区达成一致。重平衡需要借助 Kafka Broker 端的 Coordinator 组件,在 Coordinator 的帮助下完成整个消费者组的分区重分配。今天我们就来详细说说这个流程。
先提示一下,我会以 Kafka 2.3 版本的源代码开启今天的讲述。在分享的过程中,对于旧版本的设计差异,我也会显式地说明。这样,即使你依然在使用比较旧的版本也不打紧,毕竟设计原理大体上是没有变化的。

触发与通知

我们先来简单回顾一下重平衡的 3 个触发条件:
组成员数量发生变化。
订阅主题数量发生变化。
订阅主题的分区数发生变化。
就我个人的经验来看,在实际生产环境中,因命中第 1 个条件而引发的重平衡是最常见的。另外,消费者组中的消费者实例依次启动也属于第 1 种情况,也就是说,每次消费者组启动时,必然会触发重平衡过程。
这部分内容我在专栏第 15 讲中已经详细介绍过了,就不再赘述了。如果你不记得的话,可以先去复习一下。
今天,我真正想引出的是另一个话题:重平衡过程是如何通知到其他消费者实例的?答案就是,靠消费者端的心跳线程(Heartbeat Thread)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka消费者组重平衡是一个复杂而精密的过程,涉及到消费者端和协调者组件的紧密协作。本文首先介绍了重平衡的触发条件和通知机制,强调了心跳线程在重平衡通知中的关键作用。接着,详细解释了消费者组状态机的设计原理,包括状态流转和过期位移删除等内容。从消费者端的视角分析了重平衡的流程,包括加入组和等待领导者消费者分配方案两个步骤,以及JoinGroup请求和SyncGroup请求的处理过程。最后,提及了协调者端的执行过程。整体而言,本文深入剖析了Kafka消费者组重平衡的全流程,对于理解其技术特点和原理具有重要参考价值。文章还提出了开放讨论,探讨了重平衡过程中的暂停消费问题,并邀请读者一起探讨解决方案。欢迎分享给你的朋友,一起深入学习Kafka的消费者重平衡流程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kafka 核心技术与实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(119)

  • 最新
  • 精选
  • Alexhuihui
    置顶
    我用一张图来形象地说明一下 JoinGroup 请求的处理过程。 这个地方是不是不对 同一个组还能允许不同实例订阅不同的主题吗
    2023-10-26归属地:广东
    1
  • LRocccccc
    置顶
    是我理解错了么?为什么场景一二三的图中的SyncGroup请求,都是等待Leader分配方案,leader不应该提供方案么?

    作者回复: 嗯嗯,确实是。只是目前Kafka要求所有consumer都发送SyncGroup请求给Coordinator,因为分配方案只能通过SyncGroupResponse的方式获取。图中只是想表示这是一种机制,没有太区分consumer leader和其他consumer

    2019-08-02
    7
    17
  • rm -rf 😊ི
    置顶
    老师,在Broker 端重平衡场景剖析这个第一个图里面,既然协调者说了成员2是这个组的leader,为啥成员2的SyncGroup请求会是”等待leader分配“?这是笔误吗?后面几幅图好像也这样。。。

    作者回复: 只是想表明这是统一的一种机制。。。源代码中肯定没有这样的话。。。

    2019-07-31
    3
    4
  • DFighting
    重平衡能不能参照JVM中的Minor gc和Major gc,将重平衡分为两步,在资源的角度讲集群进行分区,这里的资源可以理解为分区,因为后两种变化都是涉及到分区——新主题或已有主题的分区数量变化,对于现有的三种重平衡情况分别做如下处理: 1、新成员入区,在当前区内进行重平衡,不要影响其他的分区 2、资源分区中需要消费的分区队列数量发生的变化,也只是涉及到当前分区的重平衡。 这样设计的话就需要处理一个资源分区太空闲和太繁忙时的问题,我觉得可以参考m树的节点分裂和合并,这么做比m树更简单,因为它没有层级关系,只是资源分区的整合和划分而已,实现的时候还能兼顾到网络的局部特性,当然这只是初步想法,没有详细设计和验证,不知道有没有什么地方没有考虑周全,望老师能指点一二。

    作者回复: 嗯嗯,非常赞的思路。现在社区正在对rebalance进行改革中有很多思想和你也有重合之处。

    2019-09-09
    3
    47
  • Frank
    这节课,干货很多,我现在有个疑问,重平衡时需要从消费者实例中选择一个leader,让leader来发起重平衡方案,那为啥不直接让协调者组件来处理呢?

    作者回复: 客户端自己确定分配方案有很多好处。比如可以独立演进和上线,不依赖于服务器端

    2019-08-06
    7
    36
  • ban
    不会超过 session.timeout.ms 就能感知 老师,请问下,消费者已经崩溃了,不会发送心跳,协调者这时候怎么做到能到session.timeout.ms感知的。

    作者回复: 每次consumer发送心跳时会顺带发送session timeout时间,这样Coordinator收到后会根据这个session timeout时间计算下次deadline时间,如果过了deadline还没有收到直接fail掉该consumer

    2019-08-01
    4
    34
  • Geek_0819
    老师,有个问题文中说joingroup时等待所有消费者上报订阅信息,协调者通过什么判断所有消费者都已经上报了,或者说怎么知道有多少消费者客户端。如果上报信息后,消费者客户端崩溃了,这能等待下次心跳才能知道吗?

    作者回复: join group时也是有一个总的超时时间的(取所有member最大的rebalance超时时间),靠这个作为判断是否进入到下一阶段的阈值。

    2020-01-12
    7
    21
  • 菜鸟和谐号
    不同的消费者消费不同的topic主题的领导者都是一个吗,我记得好像不同topic主题的协调者都不是一个啊,老师求解答

    作者回复: 一个组对应一个Coordinator,与topic主题无关

    2019-08-19
    19
  • 极极
    老师,最后一张图,再平衡前,要求在规定时间内提交位移,这个规定时间如何设置?默认值是什么?

    作者回复: rebalance timeout,默认是max.poll.intervals的值

    2020-02-20
    5
    16
  • wgcris
    老师,您好,请教个问题,最近使用consumer消费,发现consumer会出现commit offset failed,coordinator is not available 的错误,导致consumer卡住,无法消费。根据错误信息,是由于找不到groupcoordinator导致的,但coordinator不可以是在什么情况下发生的?一个猜测是由于consumer端发送心跳超时导致groupcoordinator认为该consumer死了,将该consumer剔除该group,导致该consumer不可用,一直卡住,不知道这种解释是否正确

    作者回复: commit失败先看看是不是消息处理慢导致的吧。比如增加max.poll.interval.ms的值或降低max.poll.records的值试试看。Client端报出Coordinator不可用不一定表示Coordinator真的不可用

    2019-12-21
    15
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部