15 | 消费者组到底是什么?
该思维导图由 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-2326 - October消费组中的消费者个数如果超过topic的分区数,就会有消费者消费不到数据。但如果是同一个消费组里的两个消费者通过assign方法订阅了同一个TopicPartition,是不是会有一个消费者不能消费到消息?
作者回复: 如果使用assign,则表明该consumer是独立consumer(standalone consumer),它不属于任何消费者组。独立consumer可以订阅任何分区,彼此之间也没有关系,即两个独立consumer可以订阅并消费相同的分区
2019-07-06368 - 注定非凡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-02460 - 电光火石如何避免rebalance发生?我发现线上在没有这三种情况也会发生,我猜是网络瞬断导致的,但不知道kafka是否会发生定时的rebalance?谢谢了
作者回复: 网络断了,心跳中断,consumer被踢出组,也属于第一种情况
2019-07-08432 - 张珮磊想静静会不会存在这样一个情况:一个consumer正在消费一个分区的一条消息,还没有消费完,发生了rebalance(加入了一个consumer),从而导致这条消息没有消费成功,rebalance后,另一个consumer又把这条消息消费一遍
作者回复: 非常可能存在
2019-07-311031 - 永光发布 / 订阅模型倒是允许消息被多个 Consumer 消费,但它的问题也是伸缩性不高,因为每个订阅者都必须要订阅主题的所有分区。这种全量订阅的方式既不灵活,也会影响消息的真实投递效果。 问题: 1、每个订阅者都必须要订阅主题的所有分区,是否意味着每个订阅者都需要消费所有的分区的所有消息? 2、我理解一个主题下进行分区消费就可以满足日需求了,Consumer Group为什么设计成可以订阅多个主题,什么样的场景会使订阅多个主题? 谢谢。
作者回复: 1. 不会。每个订阅者分配一部分分区消费 2. 没有什么规定要求什么场景下需要订阅多个主题。事实上,对于默认的分区策略,一个组订阅多个主题的做法会导致分配的极不均匀,但我们依然还是能够找出一些场景,使得这么做是有意义的。比如消费者组订阅多组传感器的数据,我们不确定未来新增传感器的主题名到底是什么,但可以约定所有传感器的主题名以sensor开头,那么此时让group订阅以sensor开头的所有主题就能动态地检测后续新增的主题。这个场景是不是有意义些?
2019-07-1126 - 小虞仔传统消息引擎的弊端 传统的消息引擎主要有2种模式:点对点模式 和 发布/订阅模式 但是不管是点对点模式,还是发布/订阅模式,队列发消息的能力是一定的:即某队列发完积压的所有消息的时间是有上限的,最短的时间是:消息数量*发送单个消息的时间 并且,传统消息引擎的“弹性”比较差,如果是消息引擎主动推送消息,很有可能会造成消费者端积压了很多的消息,那么,这和消息引擎的初衷“削峰填谷”是相违背的。如果是消费者主动拉取消息,可能造成多个消费者抢一条消息的情况。 另一个方面是,传统消息队列的容错性比较差。消息发送完成,就从队列移除了,没有办法重新消费。 Kafka是如何解决的 Kafka引入了主题,分区,消费者组,消费者,位移的概念,来解决扩展性和容错性问题。 试想,如果我们要提高传统消息引擎的TPS,在计算机I/O能力一定的情况下,只能通过增加节点的方式,使得多个节点构成一个消息队列。那么对应到Kafka里面,节点就是分区,消息队列就是主题。 同时引入位移的概念,解决了消费者端消息积压的问题。并且有多个消费者组成消费者组,提高消费能力。这也就解释了,为什么kafka某个主题下的单个分区只能分配给消费者组内的一个消费者。从逻辑上讲,如果分配给同组内的2个消费者,就相当于重复发送了2次消息,这是没有必要的。 Kafka这么做相当于把原本"串行"的消息发送"并行"化,因此TPS大大提升。 Kafka的缺点 缺点主要是Rebalance 过程,耗费的时间巨大,并且目前也没有什么好的解决办法,最好就是尽量减少Rebalance 的过程。 最后 也不是说传统消息引擎就该淘汰了,还是得看具体的业务场景。但是在大数据处理方便,Kafka是具有优势的。 (不知道理解的对不对,还望老师指正)
作者回复: 总结得非常全面了:)
2019-12-19625 - DCRebalance无法避免,又很慢,如果只是站在使用者的角度看的话,那这kafka怎么感觉很不行啊,在考虑技术栈的时候难道放弃它?
作者回复: 社区2.3引入了static consumer,这样consumer程序正常的停机重启不会rebalance,值得一试:)
2019-08-06216 - WL请问老师有啥好办法避免发生rebalance呢?感觉热rebalance的触发条件很容易发生啊,消费者组中的一台服务器出问题不就rebalance了,那整个组不可用了不是变相的把问题扩大化了吗?
作者回复: 好好设置max.poll.interval.ms的值。实在不行可以尝试使用standalone consumer
2019-07-09215 - 末北。老师请问我的程序经常出现partitions revoked:这种会是什么原因导致的那
作者回复: rebalance时会回收所有consumer负责的分区,也就是所谓的revoked。查一下为什么会频繁地出现rebalance吧
2019-07-0913