Kafka核心技术与实战
胡夕
人人贷计算平台部总监,Apache Kafka Contributor
立即订阅
8408 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学习Kafka?
免费
Kafka入门 (5讲)
01 | 消息引擎系统ABC
02 | 一篇文章带你快速搞定Kafka术语
03 | Kafka只是消息引擎系统吗?
04 | 我应该选择哪种Kafka?
05 | 聊聊Kafka的版本号
Kafka的基本使用 (3讲)
06 | Kafka线上集群部署方案怎么做?
07 | 最最最重要的集群参数配置(上)
08 | 最最最重要的集群参数配置(下)
客户端实践及原理剖析 (14讲)
09 | 生产者消息分区机制原理剖析
10 | 生产者压缩算法面面观
11 | 无消息丢失配置怎么实现?
12 | 客户端都有哪些不常见但是很高级的功能?
13 | Java生产者是如何管理TCP连接的?
14 | 幂等生产者和事务生产者是一回事吗?
15 | 消费者组到底是什么?
16 | 揭开神秘的“位移主题”面纱
17 | 消费者组重平衡能避免吗?
18 | Kafka中位移提交那些事儿
19 | CommitFailedException异常怎么处理?
20 | 多线程开发消费者实例
21 | Java 消费者是如何管理TCP连接的?
22 | 消费者组消费进度监控都怎么实现?
深入Kafka内核 (5讲)
23 | Kafka副本机制详解
24 | 请求是怎么被处理的?
25 | 消费者组重平衡全流程解析
26 | 你一定不能错过的Kafka控制器
27 | 关于高水位和Leader Epoch的讨论
管理与监控 (12讲)
28 | 主题管理知多少?
29 | Kafka动态配置了解下?
30 | 怎么重设消费者组位移?
31 | 常见工具脚本大汇总
32 | KafkaAdminClient:Kafka的运维利器
33 | Kafka认证机制用哪家?
34 | 云环境下的授权该怎么做?
35 | 跨集群备份解决方案MirrorMaker
36 | 你应该怎么监控Kafka?
37 | 主流的Kafka监控框架
38 | 调优Kafka,你做到了吗?
39 | 从0搭建基于Kafka的企业级实时日志流处理平台
高级Kafka应用之流处理 (3讲)
40 | Kafka Streams与其他流处理平台的差异在哪里?
41 | Kafka Streams DSL开发实例
42 | Kafka Streams在金融领域的应用
结束语 (1讲)
结束语 | 以梦为马,莫负韶华!
特别放送 (2讲)
加餐 | 搭建开发环境、阅读源码方法、经典学习资料大揭秘
用户故事 | 黄云:行百里者半九十
Kafka核心技术与实战
登录|注册

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

胡夕 2019-07-06
你好,我是胡夕。今天我要和你分享的主题是: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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(71)

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

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

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

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

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

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

    2019-07-06
    6
  • QQ怪
    老师最后那个Rebalance例子有问题吧,最后每个consumer只有两个而不是三个吧

    作者回复: 嗯嗯,不就是每个consumer分配两个吗?

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

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

    2019-07-11
    5
  • 东方奇骥
    难得一个双休,今天终于学习到这篇了,好想实战上手玩一玩Kafka。老师,最后一个章节才会有实战Demo吗?
    2019-07-06
    5
  • Tony Du
    请老师讲讲手动管理consumer offset的工程实践

    作者回复: 专栏后面有专门的内容:)

    2019-07-06
    5
  • 骨汤鸡蛋面
    我们现在服务是3个topic,每个topic有64个分区,6个消费实例,每次服务重新部署(6个实例依次关闭启动)都会导致长时间的rebalance,是否减少topic的分区数可以减少服务部署时rebalance的时间呢?

    作者回复: 嗯,会的。减少consumer个数也有缩短rebalance。

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

    作者回复: 非常可能存在

    2019-07-31
    1
    3
  • Xiao
    老师,rebalance的时候可以不可以这样做,如果是consumer挂掉导致,那不做group的rebalance,仅仅是将挂掉节点上的partition重新分配给别的consume让,只有在consumer消费特别不均匀的情况下才做group的rebalance;
    如果是添加节点导致rebalance,那也不用一次性就做,可以分阶段,比如说先把消费压力大的consumer上的partition分一部分给新进来的consumer!
    2019-07-08
    1
    2
  • ☆appleう
    举个简单的例子,假设一个 Consumer Group 订阅了 3 个主题,分别是 A、B、C,它们的分区数依次是 1、2、3,那么通常情况下,为该 Group 设置 6 个 Consumer 实例是比较理想的情形,因为它能最大限度地实现高伸缩性。

    你可能会问,我能设置小于或大于 6 的实例吗?当然可以!如果你有 3 个实例,那么平均下来每个实例大约消费 2 个分区(6 / 3 = 2);如果你设置了 8 个实例,那么很遗憾,有 2 个实例(8 – 6 = 2)将不会被分配任何分区,它们永远处于空闲状态。因此,在实际使用过程中一般不推荐设置大于总分区数的 Consumer 实例。设置多余的实例只会浪费资源,而没有任何好处。


    老师,针对上面这段例子有一个问题: 如果8个实例,6个分区,每个实例负责分配一个分区,多出来的2个实例不能与其他消费实例共同负责一个分区吗?

    作者回复: 如果它们都属于同一个消费者组,那么不能。消费者组订阅的分区只能被组内一个consumer实例消费。

    2019-07-07
    2
  • maben996
    文中提到,同一个Group中的不同Consumer实例负责消费Topic的不同分区。
    有一个问题,同一个Group中的不同Consumer实例可以订阅不同的Topic吗?

    作者回复: 可以的。虽然在实际使用中可能更多的还是同一个group的多个实例订阅相同的topic。

    2019-10-22
    1
  • Ryan
    胡老师好,有一个rebalance的问题请教一下:
    假设一个topic有P1和P2两个分区, 由同一消费者组中的C1和C2消费, C1消费P1, C2消费P2。
    C1和C2都是手动管理offset的,消息消费后,会将offset保存到mysql中,然后commit到broker
    某一时刻,C1 offset到100 消费完成后保存mysql, 但是没有调用commitSync()
    C2 offset到200, 消费完成后保存offset到mysql, 但是没有调用commitSync()
    然后发生了rebalance, rebalance后,C1分配到P2分区,C2分配到P1分区。
    之后,C1和C2调用commitSync(), (其实是commit rebalance前的分区的offset),会发生什么情况?

    作者回复: 如果你没有实现ConsumerRebalanceListener接口中的方法显式从MySQL中恢复offset,那么rebalance回来后会从Broker中读取Kafka这边保存的已知的最新位移,但很可能不是你MySQL中保存的位移,因此此时调用commitSync没有什么效果。

    2019-10-14
    1
  • 北冥Master
    elasticsearch在增加分片和减少分片时也有类似的重平衡的过程。es需要迁移数据所以时间会很长,kafka又不用迁移数据为什么要几个小时?看起来只是分区ID重新哈希一下?耗时主要在哪里?

    作者回复: kafka增加了分区手动迁移的话也要迁移数据的

    2019-08-26
    2
    1
  • godtrue
    老师好,我有以下几个疑问,请帮忙解答一下,多谢!
    1:请问老师,什么场景下消费者组中的一个实例会是一个进程中的线程呢?

    2:传统的消息队列模型的缺陷在于消息一旦被消费,就会从队列中被删除,而且只能被下游的一个 Consumer 消费。
    请问老师,这里描述的删除操作,具体是什么操作?将消息从队列中移出?还是移动位移标识此位置可以使用?这些操作应该是内存中的吧!对于落盘的消息以及副本中的消息也有删除的动作吧?删除一个消息的完整流程是怎么样的呢?

    3:发布 / 订阅模型倒是允许消息被多个 Consumer 消费,但它的问题也是伸缩性不高,因为每个订阅者都必须要订阅主题的所有分区。这种全量订阅的方式既不灵活,也会影响消息的真实投递效果。
    如果一个主题可以有多个分区,也能增加分区数据,如果消费能力不足,可以增加消费者,这种方式没理解怎么伸缩性就不高了?不是一个consumer实例只能消费主题下的一个分区嘛?

    作者回复: 1. 如果你的client端机器非常强劲,只启动一个consumer实例单线程消费未免有些浪费,你可以以启动多个线程的方式来充分利用资源。
    2. 消息被删除。具体流程因不同框架而定
    3. 1个consumer必须订阅所有分区,这是不必要的

    2019-08-15
    1
  • 老鱼
    rebalance时,全部实例都要参与重新分配。是否能参考 一致性哈希算法,尽量减少对全局的影响?

    作者回复: 是个不错的思路:)

    2019-07-24
    1
  • 牧码人
    想请问一下consumer group可以删除吗?或者有其他命令管理吗?

    作者回复: 可以删除。使用kafka-consumer-groups命令

    2019-07-08
    1
  • 愚人
    订阅topic是在消费者程序中实现的,如果一个group内多个消费者分别订阅了不同的topic,是不是所有这些topic下的全部分区都会统一分配这个group内的消费者?比如group内消费者A只订阅topic1,但是topic2(被另一个消费者订阅)下的某一个分区却分配给了消费者A?

    作者回复: 不会的。分配的原则还是要考虑每个consumer的订阅情况。不可能把你没订阅的分区分给你

    2019-11-30
  • man1s
    那我如果有100个分区,100个同组消费者,在启动这100个消费者过程中会发生100次rebalace吗

    作者回复: 目前不会

    2019-11-19
收起评论
71
返回
顶部