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

15 | 消费者组到底是什么?

消费者组设计的弊端
Rebalance的设计
Rebalance的影响
Rebalance的触发条件
位移保存在Kafka内部主题的方法
位移保存在ZooKeeper中的问题
新旧Consumer的区别
位移(Offset)的概念
Consumer实例的数量应该等于该Group订阅主题的分区总数
实现传统消息引擎系统的两大模型
避开传统消息队列模型的缺陷
发布/订阅模型
点对点模型
Consumer Group下所有实例订阅的主题的单个分区,只能分配给组内的某个Consumer实例消费
Group ID是一个字符串,在一个Kafka集群中,它标识唯一的一个Consumer Group
Consumer Group下可以有一个或多个Consumer实例
开放讨论
Consumer Group端的重平衡
Consumer Group的位移管理
Consumer实例数量与分区总数的关系
Kafka的Consumer Group的设计
消息引擎模型
Consumer Group的特性
Consumer Group是Kafka提供的可扩展且具有容错性的消费者机制
Kafka的消费者组

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

你好,我是胡夕。今天我要和你分享的主题是:Kafka 的消费者组。
消费者组,即 Consumer Group,应该算是 Kafka 比较有亮点的设计了。那么何谓 Consumer Group 呢?用一句话概括就是:Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。既然是一个组,那么组内必然可以有多个消费者或消费者实例(Consumer Instance),它们共享一个公共的 ID,这个 ID 被称为 Group ID。组内的所有消费者协调在一起来消费订阅主题(Subscribed Topics)的所有分区(Partition)。当然,每个分区只能由同一个消费者组内的一个 Consumer 实例来消费。个人认为,理解 Consumer Group 记住下面这三个特性就好了。
Consumer Group 下可以有一个或多个 Consumer 实例。这里的实例可以是一个单独的进程,也可以是同一进程下的线程。在实际场景中,使用进程更为常见一些。
Group ID 是一个字符串,在一个 Kafka 集群中,它标识唯一的一个 Consumer Group。
Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。这个分区当然也可以被其他的 Group 消费。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka消费者组是一种可扩展且具有容错性的消费者机制,允许多个消费者实例共享一个Group ID,并协调消费订阅主题的所有分区。消费者组避免了传统消息引擎模型的缺陷,实现了消息队列模型和发布/订阅模型的优点。在实际应用中,消费者实例的数量应该与Group订阅主题的分区总数相匹配。Kafka管理位移的方式随着版本更新而变化,新版本的Consumer Group将位移保存在Broker端的内部主题中。此外,Rebalance是Consumer Group的重要协议,触发条件包括组成员数、订阅主题数和订阅主题的分区数发生变更。尽管Rebalance过程对消费过程有影响,但其设计特性和位移管理方式展现了Kafka消费者组的技术特点和重要性。文章全面介绍了Kafka Consumer Group的定义、解决的问题、特性、位移管理以及Rebalance过程,为开发Consumer应用提供了有力支持。

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

全部留言(137)

  • 最新
  • 精选
  • 耿斌
    置顶
    “显然,Rebalance 之后的分配依然是公平的,即每个 Consumer 实例都获得了 3 个分区的消费权。” 这里应该是每个Consumer实例都获得了2个分区的消费权 有个问题,Consumer group是可以任意指定创建的?

    作者回复: 感谢纠正:) 可以任意指定创建

    2019-07-23
    2
    6
  • October
    消费组中的消费者个数如果超过topic的分区数,就会有消费者消费不到数据。但如果是同一个消费组里的两个消费者通过assign方法订阅了同一个TopicPartition,是不是会有一个消费者不能消费到消息?

    作者回复: 如果使用assign,则表明该consumer是独立consumer(standalone consumer),它不属于任何消费者组。独立consumer可以订阅任何分区,彼此之间也没有关系,即两个独立consumer可以订阅并消费相同的分区

    2019-07-06
    3
    68
  • 注定非凡
    Consumer Group :Kafka提供的可扩展且具有容错性的消息者机制。 1,重要特征: A:组内可以有多个消费者实例(Consumer Instance)。 B:消费者组的唯一标识被称为Group ID,组内的消费者共享这个公共的ID。 C:消费者组订阅主题,主题的每个分区只能被组内的一个消费者消费 D:消费者组机制,同时实现了消息队列模型和发布/订阅模型。 2,重要问题: A:消费组中的实例与分区的关系: 消费者组中的实例个数,最好与订阅主题的分区数相同,否则多出的实例只会被闲置。一个分区只能被一个消费者实例订阅。 B:消费者组的位移管理方式: (1)对于Consumer Group而言,位移是一组KV对,Key是分区,V对应Consumer消费该分区的最新位移。 (2)Kafka的老版本消费者组的位移保存在Zookeeper中,好处是Kafka减少了Kafka Broker端状态保存开销。但ZK是一个分布式的协调框架,不适合进行频繁的写更新,这种大吞吐量的写操作极大的拖慢了Zookeeper集群的性能。 (3)Kafka的新版本采用了将位移保存在Kafka内部主题的方法。 C:消费者组的重平衡: (1)重平衡:本质上是一种协议,规定了消费者组下的每个消费者如何达成一致,来分配订阅topic下的每个分区。 (2)触发条件: a,组成员数发生变更 b,订阅主题数发生变更 c,定阅主题分区数发生变更 (3)影响: Rebalance 的设计是要求所有consumer实例共同参与,全部重新分配所有用分区。并且Rebalance的过程比较缓慢,这个过程消息消费会中止。

    作者回复: 专栏结束了把你的分享笔记share出来吧:)

    2019-11-02
    4
    60
  • 电光火石
    如何避免rebalance发生?我发现线上在没有这三种情况也会发生,我猜是网络瞬断导致的,但不知道kafka是否会发生定时的rebalance?谢谢了

    作者回复: 网络断了,心跳中断,consumer被踢出组,也属于第一种情况

    2019-07-08
    4
    32
  • 张珮磊想静静
    会不会存在这样一个情况:一个consumer正在消费一个分区的一条消息,还没有消费完,发生了rebalance(加入了一个consumer),从而导致这条消息没有消费成功,rebalance后,另一个consumer又把这条消息消费一遍

    作者回复: 非常可能存在

    2019-07-31
    10
    31
  • 永光
    发布 / 订阅模型倒是允许消息被多个 Consumer 消费,但它的问题也是伸缩性不高,因为每个订阅者都必须要订阅主题的所有分区。这种全量订阅的方式既不灵活,也会影响消息的真实投递效果。 问题: 1、每个订阅者都必须要订阅主题的所有分区,是否意味着每个订阅者都需要消费所有的分区的所有消息? 2、我理解一个主题下进行分区消费就可以满足日需求了,Consumer Group为什么设计成可以订阅多个主题,什么样的场景会使订阅多个主题? 谢谢。

    作者回复: 1. 不会。每个订阅者分配一部分分区消费 2. 没有什么规定要求什么场景下需要订阅多个主题。事实上,对于默认的分区策略,一个组订阅多个主题的做法会导致分配的极不均匀,但我们依然还是能够找出一些场景,使得这么做是有意义的。比如消费者组订阅多组传感器的数据,我们不确定未来新增传感器的主题名到底是什么,但可以约定所有传感器的主题名以sensor开头,那么此时让group订阅以sensor开头的所有主题就能动态地检测后续新增的主题。这个场景是不是有意义些?

    2019-07-11
    26
  • 小虞仔
    传统消息引擎的弊端 传统的消息引擎主要有2种模式:点对点模式 和 发布/订阅模式 但是不管是点对点模式,还是发布/订阅模式,队列发消息的能力是一定的:即某队列发完积压的所有消息的时间是有上限的,最短的时间是:消息数量*发送单个消息的时间 并且,传统消息引擎的“弹性”比较差,如果是消息引擎主动推送消息,很有可能会造成消费者端积压了很多的消息,那么,这和消息引擎的初衷“削峰填谷”是相违背的。如果是消费者主动拉取消息,可能造成多个消费者抢一条消息的情况。 另一个方面是,传统消息队列的容错性比较差。消息发送完成,就从队列移除了,没有办法重新消费。 Kafka是如何解决的 Kafka引入了主题,分区,消费者组,消费者,位移的概念,来解决扩展性和容错性问题。 试想,如果我们要提高传统消息引擎的TPS,在计算机I/O能力一定的情况下,只能通过增加节点的方式,使得多个节点构成一个消息队列。那么对应到Kafka里面,节点就是分区,消息队列就是主题。 同时引入位移的概念,解决了消费者端消息积压的问题。并且有多个消费者组成消费者组,提高消费能力。这也就解释了,为什么kafka某个主题下的单个分区只能分配给消费者组内的一个消费者。从逻辑上讲,如果分配给同组内的2个消费者,就相当于重复发送了2次消息,这是没有必要的。 Kafka这么做相当于把原本"串行"的消息发送"并行"化,因此TPS大大提升。 Kafka的缺点 缺点主要是Rebalance 过程,耗费的时间巨大,并且目前也没有什么好的解决办法,最好就是尽量减少Rebalance 的过程。 最后 也不是说传统消息引擎就该淘汰了,还是得看具体的业务场景。但是在大数据处理方便,Kafka是具有优势的。 (不知道理解的对不对,还望老师指正)

    作者回复: 总结得非常全面了:)

    2019-12-19
    6
    25
  • DC
    Rebalance无法避免,又很慢,如果只是站在使用者的角度看的话,那这kafka怎么感觉很不行啊,在考虑技术栈的时候难道放弃它?

    作者回复: 社区2.3引入了static consumer,这样consumer程序正常的停机重启不会rebalance,值得一试:)

    2019-08-06
    2
    16
  • WL
    请问老师有啥好办法避免发生rebalance呢?感觉热rebalance的触发条件很容易发生啊,消费者组中的一台服务器出问题不就rebalance了,那整个组不可用了不是变相的把问题扩大化了吗?

    作者回复: 好好设置max.poll.interval.ms的值。实在不行可以尝试使用standalone consumer

    2019-07-09
    2
    15
  • 末北。
    老师请问我的程序经常出现partitions revoked:这种会是什么原因导致的那

    作者回复: rebalance时会回收所有consumer负责的分区,也就是所谓的revoked。查一下为什么会频繁地出现rebalance吧

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