15 | 消费者组到底是什么?
15 | 消费者组到底是什么?
讲述:胡夕
时长12:32大小11.48M
小结
开放讨论
赞 31
提建议
精选留言(132)
- 耿斌置顶2019-07-23“显然,Rebalance 之后的分配依然是公平的,即每个 Consumer 实例都获得了 3 个分区的消费权。” 这里应该是每个Consumer实例都获得了2个分区的消费权 有个问题,Consumer group是可以任意指定创建的?
作者回复: 感谢纠正:) 可以任意指定创建
共 2 条评论6 - October2019-07-06消费组中的消费者个数如果超过topic的分区数,就会有消费者消费不到数据。但如果是同一个消费组里的两个消费者通过assign方法订阅了同一个TopicPartition,是不是会有一个消费者不能消费到消息?
作者回复: 如果使用assign,则表明该consumer是独立consumer(standalone consumer),它不属于任何消费者组。独立consumer可以订阅任何分区,彼此之间也没有关系,即两个独立consumer可以订阅并消费相同的分区
共 2 条评论67 - 注定非凡2019-11-02Consumer 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出来吧:)
共 4 条评论56 - 电光火石2019-07-08如何避免rebalance发生?我发现线上在没有这三种情况也会发生,我猜是网络瞬断导致的,但不知道kafka是否会发生定时的rebalance?谢谢了
作者回复: 网络断了,心跳中断,consumer被踢出组,也属于第一种情况
共 3 条评论32 - 张珮磊想静静2019-07-31会不会存在这样一个情况:一个consumer正在消费一个分区的一条消息,还没有消费完,发生了rebalance(加入了一个consumer),从而导致这条消息没有消费成功,rebalance后,另一个consumer又把这条消息消费一遍
作者回复: 非常可能存在
共 10 条评论28 - 东风第一枝2019-12-19传统消息引擎的弊端 传统的消息引擎主要有2种模式:点对点模式 和 发布/订阅模式 但是不管是点对点模式,还是发布/订阅模式,队列发消息的能力是一定的:即某队列发完积压的所有消息的时间是有上限的,最短的时间是:消息数量*发送单个消息的时间 并且,传统消息引擎的“弹性”比较差,如果是消息引擎主动推送消息,很有可能会造成消费者端积压了很多的消息,那么,这和消息引擎的初衷“削峰填谷”是相违背的。如果是消费者主动拉取消息,可能造成多个消费者抢一条消息的情况。 另一个方面是,传统消息队列的容错性比较差。消息发送完成,就从队列移除了,没有办法重新消费。 Kafka是如何解决的 Kafka引入了主题,分区,消费者组,消费者,位移的概念,来解决扩展性和容错性问题。 试想,如果我们要提高传统消息引擎的TPS,在计算机I/O能力一定的情况下,只能通过增加节点的方式,使得多个节点构成一个消息队列。那么对应到Kafka里面,节点就是分区,消息队列就是主题。 同时引入位移的概念,解决了消费者端消息积压的问题。并且有多个消费者组成消费者组,提高消费能力。这也就解释了,为什么kafka某个主题下的单个分区只能分配给消费者组内的一个消费者。从逻辑上讲,如果分配给同组内的2个消费者,就相当于重复发送了2次消息,这是没有必要的。 Kafka这么做相当于把原本"串行"的消息发送"并行"化,因此TPS大大提升。 Kafka的缺点 缺点主要是Rebalance 过程,耗费的时间巨大,并且目前也没有什么好的解决办法,最好就是尽量减少Rebalance 的过程。 最后 也不是说传统消息引擎就该淘汰了,还是得看具体的业务场景。但是在大数据处理方便,Kafka是具有优势的。 (不知道理解的对不对,还望老师指正)展开
作者回复: 总结得非常全面了:)
共 6 条评论24 - 永光2019-07-11发布 / 订阅模型倒是允许消息被多个 Consumer 消费,但它的问题也是伸缩性不高,因为每个订阅者都必须要订阅主题的所有分区。这种全量订阅的方式既不灵活,也会影响消息的真实投递效果。 问题: 1、每个订阅者都必须要订阅主题的所有分区,是否意味着每个订阅者都需要消费所有的分区的所有消息? 2、我理解一个主题下进行分区消费就可以满足日需求了,Consumer Group为什么设计成可以订阅多个主题,什么样的场景会使订阅多个主题? 谢谢。展开
作者回复: 1. 不会。每个订阅者分配一部分分区消费 2. 没有什么规定要求什么场景下需要订阅多个主题。事实上,对于默认的分区策略,一个组订阅多个主题的做法会导致分配的极不均匀,但我们依然还是能够找出一些场景,使得这么做是有意义的。比如消费者组订阅多组传感器的数据,我们不确定未来新增传感器的主题名到底是什么,但可以约定所有传感器的主题名以sensor开头,那么此时让group订阅以sensor开头的所有主题就能动态地检测后续新增的主题。这个场景是不是有意义些?
25 - DC2019-08-06Rebalance无法避免,又很慢,如果只是站在使用者的角度看的话,那这kafka怎么感觉很不行啊,在考虑技术栈的时候难道放弃它?
作者回复: 社区2.3引入了static consumer,这样consumer程序正常的停机重启不会rebalance,值得一试:)
共 2 条评论16 - WL2019-07-09请问老师有啥好办法避免发生rebalance呢?感觉热rebalance的触发条件很容易发生啊,消费者组中的一台服务器出问题不就rebalance了,那整个组不可用了不是变相的把问题扩大化了吗?
作者回复: 好好设置max.poll.interval.ms的值。实在不行可以尝试使用standalone consumer
14 - 末北。2019-07-09老师请问我的程序经常出现partitions revoked:这种会是什么原因导致的那
作者回复: rebalance时会回收所有consumer负责的分区,也就是所谓的revoked。查一下为什么会频繁地出现rebalance吧
12 - 曹操2019-07-08请问一下老师,kafka有基于时间戳的消费方式吗?比如我想从某个时间点之后投入kafka的数据开始消费?
作者回复: 有,KafkaConsumer有offsetsForTimes方法
共 2 条评论13 - Geek_81eb3d2020-05-09感觉rebalance的触发条件2和3都可以通过早期设定的方式避免,关键是条件1,没法避免呀。比如我有多台生产服务器(同个消费组),我发布的时候怎么弄?发布总有先后,难道我发布也影响整个消息服务?那影响也太大了,怎么敢投产,求解。
作者回复: 嗯嗯,社区一直在改进这个rebalance。要么你可以使用standalone consumer,要么可以采用2.4版本的consumer group,支持静态成员
10 - HZ2020-02-24老师,以下两种情况会出发重平衡吗? 1. 每个consumer只有一个分区,然后我们新增一个consumer。 2. 假如consumer group里面 有几个idle的consumer,移除这些idle consumer。
作者回复: 1. 目前只要group新增consumer实例就会触发rebalance,和consumer订阅什么分区无关 2. 移除idle consumer也会触发
共 3 条评论10 - Tony Du2019-07-06请老师讲讲手动管理consumer offset的工程实践
作者回复: 专栏后面有专门的内容:)
9 - 芒果2020-01-08您好,请问如果一开始通过正则订阅了topic.*,找到了topic01,后来新增了一个topic02,触发了rebalance,topic01并没有变化,消费者数量也不变,rebalance期间也会导致消费者在topic01上的消费全部停止吗?
作者回复: 会的。目前rebalance(2.4, 2.5版本之前)是stop-the-world操作,rebalance期间暂停所有consumer消费
共 2 条评论9 - 末北。2019-07-10老师你好,如果一个topic的consumer产生变化,那么进行重平衡的时候,只是这一个topic发生重平衡还是所有topic都会发生重平衡,这时候所有的消息都不能消费是吗?等重平衡结束才能再次消费吗?
作者回复: 重平衡是指consumer group级别的,不是主题级别的。Rebalance时所有consumer都不能消费,等结束后才能继续消费
9 - 东方奇骥2019-07-06难得一个双休,今天终于学习到这篇了,好想实战上手玩一玩Kafka。老师,最后一个章节才会有实战Demo吗?共 1 条评论7
- nightmare2019-07-06什么时候来个consumer端手动管理offset的方案共 2 条评论7
- 阿刚2020-04-11老师,我遇到一个生产上的问题:一个消费组(大概有300多个消费者)订阅了3个topic,如topic1 ,tipic2,topic3 , 增加一个topic4,然后在这个消费组里面增加消费者来消费topic4的数据。 问题:是整个消费组发生重平衡吗?还是只是订阅topic4的消费者发生重平衡?
作者回复: 嗯,300+个consumer都会重平衡。。。
7 - maben9962019-10-22文中提到,同一个Group中的不同Consumer实例负责消费Topic的不同分区。 有一个问题,同一个Group中的不同Consumer实例可以订阅不同的Topic吗?
作者回复: 可以的。虽然在实际使用中可能更多的还是同一个group的多个实例订阅相同的topic。
共 3 条评论6