• 常超
    2019-07-20
    整个生命周期里会建立4个连接,进入稳定的消费过程后,同时保持3个连接,以下是详细。
    第一类连接:确定协调者和获取集群元数据。
     一个,初期的时候建立,当第三类连接建立起来之后,这个连接会被关闭。

    第二类连接:连接协调者,令其执行组成员管理操作。
     一个

    第三类连接:执行实际的消息获取。
    两个分别会跟两台broker机器建立一个连接,总共两个TCP连接,同一个broker机器的不同分区可以复用一个socket。
    展开
     2
     14
  • 注定非凡
    2019-11-06
    1,何时创建
        A :消费者和生产者不同,在创建KafkaConsumer实例时不会创建任何TCP连接。
            原因:是因为生产者入口类KafkaProducer在构建实例时,会在后台启动一个Sender线程,这个线程是负责Socket连接创建的。

        B :TCP连接是在调用KafkaConsumer.poll方法时被创建。在poll方法内部有3个时机创建TCP连接
        (1)发起findCoordinator请求时创建
            Coordinator(协调者)消费者端主键,驻留在Broker端的内存中,负责消费者组的组成员管理和各个消费者的位移提交管理。
            当消费者程序首次启动调用poll方法时,它需要向Kafka集群发送一个名为FindCoordinator的请求,确认哪个Broker是管理它的协调者。

        (2)连接协调者时
            Broker处理了消费者发来的FindCoordinator请求后,返回响应显式的告诉消费者哪个Broker是真正的协调者。
            当消费者知晓真正的协调者后,会创建连向该Broker的socket连接。
            只有成功连入协调者,协调者才能开启正常的组协调操作。

        (3)消费数据时
            消费者会为每个要消费的分区创建与该分区领导者副本所在的Broker连接的TCP.

    2 创建多少
        消费者程序会创建3类TCP连接:
        (1) :确定协调者和获取集群元数据
        (2):连接协调者,令其执行组成员管理操作
        (3) :执行实际的消息获取

    3 何时关闭TCP连接
        A :和生产者相似,消费者关闭Socket也分为主动关闭和Kafka自动关闭。
        B :主动关闭指通过KafkaConsumer.close()方法,或者执行kill命令,显示地调用消费者API的方法去关闭消费者。
        C :自动关闭指消费者端参数connection.max.idle.ms控制的,默认为9分钟,即如果某个socket连接上连续9分钟都没有任何请求通过,那么消费者会强行杀死这个连接。
        D :若消费者程序中使用了循环的方式来调用poll方法消息消息,以上的请求都会被定期的发送到Broker,所以这些socket连接上总是能保证有请求在发送,从而实现“长连接”的效果。
        E :当第三类TCP连接成功创建后,消费者程序就会废弃第一类TCP连接,之后在定期请求元数据时,会改为使用第三类TCP连接。对于一个运行了一段时间的消费者程序来讲,只会有后面两种的TCP连接。
    展开
    
     2
  • 信信
    2019-07-24
    一共建过四次连接。若connection.max.idle.ms 不为-1,最终会断开第一次连的ID为-1的连接。
    
     1
  • taj3991
    2019-07-22
    老师同一个消费组的客户端都只会连接到一个协调者吗?

    作者回复: 是的。每个group都有一个与之对应的coordinator

    
     1
  • Williamzhang
    2019-07-22
    我觉得作者可以跟学员的留言互动,然后每期课后思考可以在下期中贴出答案及分析,其实留言讨论也是一个非常让人有收获的地方
    
     1
  • rm -rf 😊ི
    2019-07-21
    我认为也是3个连接,第一个是查找Coordinator的,这个会在后面断开。然后5个partition会分布在2个broker上,那么客户端最多也就连接2次就能消费所有partition了,因此是连接3个,最后保持2个。
    
     1
  • October
    2019-07-21
    总共创建4个连接,最终保持3个连接:
            确定消费者所属的消费组对应的GroupCoordinator和获取集群的metadata时创建一个TCP连接,由于此时的node id = -1,所以该连接无法重用。
            连接GroupCoordinator时,创建第二个TCP连接,node id值为Integer.MAX_VALUE-id
            消费者会与每个分区的leader创建一个TCP连接来消费数据,node id为broker.id,由于kafka只是用id这一维度来表征Socket连接信息,因此如果多个分区的leader在同一个broker上时,会共用一个TCP连接,由于分区数大于broker的数量,所以会创建两个TCP连接消费数据。
    展开
    
     1
  • nightmare
    2019-07-20
    3个tcp连接 一个查询协调着和获取元数据的tcp连接 一个连接协调写 管理组成员的tcp连接 主题5个分区只有连接leader副本的broker需要创建连接
    
     1
  • Eco
    2020-01-19
    应该是3个tcp连接,第一个id=-1的没什么争议,然后是连接协调者的,但是broker,5个分区的leader肯定会分布到这两台broker上,那么第三类tcp就是2个tcp连接,但是这2个中完全可以有一个是直接使用连接协调者的那个tcp连接吧,但老师好像说过连接协调者的连接会和传输数据的分开,id的计算都不相同,好吧,那就4个tcp连接吧。可这里真的不能复用吗?我觉得可以。

    作者回复: 目前与Coordinator和普通数据交互的TCP连接的确是分开的,你要说是否能复用,我觉得当然可以复用,只不过现在没有这么设计:)

     1
    
  • 成立-Charlie
    2020-01-19
    4个
    
    
  • AAA_叶子
    2019-12-18
    消费者tcp连接一旦断开,就会导致rebalance,实际开发过程中,是不是需要尽量保证长连接的模式?

    作者回复: 嗯,如果就是要长时间的消费,维持一个长连接是不错的选择

    
    
  • 大鸡腿
    2019-12-09
    胡大佬,问下 "它连接的 Broker 节点的 ID 是 -1,表示消费者根本不知道要连接的 Kafka Broker 的任何信息。" 这边会有真实的broker机器与之对应嘛?

    作者回复: 会有的,只是暂时还不知道ID

    
    
  • 举个荔枝
    2019-10-02
    老师,想问下这里是不是笔误。
    还记得消费者端有个组件叫Coordinator吗?协调者应该是位于Broker端的吧?

    作者回复: 嗯嗯,其实这里的消费者端指的是广义的消费者,我是想说在Kafka消费者的概念中有Coordinator。当然如你所说Coordinator是Broker端的组件没错。这里的确有不严谨的地方,多谢指出:)

    
    
  • 天天向上
    2019-09-19
    元数据不包含协调者信息吗?为啥还要再请求一次协调者信息 什么设计思路?

    作者回复: 不包括,因为你请求元数据的broker可能不是Coordinator,没有Coordinator的信息

    
    
  • 兔2🐰🍃
    2019-09-09
    有2个 Broker,5个分区的领导者副本,由zookeeper分配Leader,所以默认是均匀的,第三类会创建2个TCP连接,故共有4个TCP连接。
    请问胡老师 Leader副本 分配策略是什么?

    作者回复: 如果是不考虑机架信息,你基本上可以认为是round robin策略

    
    
  • Mark
    2019-08-29
    我们要设计一个消息系统。有两个选择,更好的一种是每种不同schema的消息发一个topic。但是有一种担心是consumer会为每个topic建立一个连接,造成连接数太多。请问胡老师,kafka client的consumer是每个集群固定数目的tcp连接,还是和topic数目相关?

    作者回复: 和它要订阅的topic分区数以及这些分区在broker上的散列情况有关。比如你订阅了100个分区,但这个100个分区的leader副本都在一个broker上,那么长期来看consumer也就只和这1个broker建立连接;相反如果这100分区散列在100个broker上,那么长期来看consumer会和100个broker维持长连接

     1
    
  • 落霞与孤鹜
    2019-08-02
    最终会保留三个吧,协调者链接需要与其他链接特地分开。
    
    
  • Hello world
    2019-07-23
    老师,如果是调用consumer.createMessageStreams()这个方法,那这样也是建立min(broker数,分区leader数)+1个tcp连接吗?还有建立一个连接会启动一个线程的吧,我看了我的java进程下有几十个线程,但是好像也远远大于broker的数量。
    
    
  • 吴宇晨
    2019-07-22
    一个获取元数据的连接(之后会断开)+两个连接分区leader的连接+一个连接协调者的连接
    
    
  • 30斤的大番薯
    2019-07-22
    老师您好。我之前搭建了一个单机kafka,能正常收发消息。最近我按网上的介绍,把kafka改成集群,出现一个问题:使用kafka自带的命令行生产者工具可以成功发送消息。但是用命令行消费者工具总是接收不到数据(启动消费者一直不输出数据,仿佛没收到消息一样)。我用strace跟踪发现消费者进程一在循环进行epoll(超时)调用,kafka服务器日志无异常。请问这种情况要怎么检查问题。
     1
    
我们在线,来聊聊吧