• 柠檬C
    2019-07-02
    应该可以用懒加载的方式,实际发送时再进行TCP连接吧,虽然这样第一次发送时因为握手的原因会稍慢一点
     1
     7
  • kursk.ye
    2019-07-02
    试想一下,在一个有着 1000 台 Broker 的集群中,你的 Producer 可能只会与其中的 3~5 台 Broker 长期通信,但是 Producer 启动后依次创建与这 1000 台 Broker 的 TCP 连接。一段时间之后,大约有 995 个 TCP 连接又被强制关闭。这难道不是一种资源浪费吗?很显然,这里是有改善和优化的空间的。

    这段不敢苟同。作为消息服务器中国,连接应该是种必要资源,所以部署时就该充分给予,而且创建连接会消耗CPU,用到时再创建不合适,我甚至觉得Kafka应该有连接池的设计。

    另外最后一部分关于TCP关闭第二种情况,客户端到服务端没有关闭,只是服务端到客户端关闭了,tcp是四次断开,可以单方向关闭,另一方向继续保持连接
    展开

    作者回复: 嗯嗯,欢迎不同意见。Kafka对于创建连接没有做任何限制。如果一开始就创建所有TCP连接,之后因为超时的缘故又关闭这些连接,当真正使用时再次创建,那么为什么不把创建时机后延到真正需要的时候呢?实际场景中将TCP连接设置为长连接的情形并不多见,因此我说这种设计是可以改进的。

     2
     4
  • 开水
    2019-07-02
    觉得创建kafkaProducer的时候可以不用去创建sender线程去连接broker。
    1. 第一次更新元数据的时候,配置一个并发连接参数,比如说10,按照该连接参数的余数去和配置中broker建立TCP连接。
    2. 获取到相应的metadata信息后,再去和相应的broker进行连接,连接建立后关闭掉无用的连接。
    3. 按照原有设计,发送数据时再次检查连接。

    这样多余连接不会超过10,并且可配置。而且在更新metadata和发送数据时进行了连接的双重监测,不用进行三次监测。
    展开
     2
     3
  • 诗泽
    2019-07-02
    看来无论在bootstrap.servers中是否写全部broker 的地址接下来producer 还是会跟所有的broker 建立一次连接😂
    
     3
  • 注定非凡
    2019-10-31
    Apache Kafka的所有通信都是基于TCP的,而不是于HTTP或其他协议的
    1 为什采用TCP?
    (1)TCP拥有一些高级功能,如多路复用请求和同时轮询多个连接的能力。
        (2)很多编程语言的HTTP库功能相对的比较简陋。
            名词解释:
                多路复用请求:multiplexing request,是将两个或多个数据合并到底层—物理连接中的过程。TCP的多路复用请求会在一条物理连接上创建若干个虚拟连接,每个虚拟连接负责流转各自对应的数据流。严格讲:TCP并不能多路复用,只是提供可靠的消息交付语义保证,如自动重传丢失的报文。

    2 何时创建TCP连接?
        (1)在创建KafkaProducer实例时,
    A:生产者应用会在后台创建并启动一个名为Sender的线程,该Sender线程开始运行时,首先会创建与Broker的连接。
    B:此时不知道要连接哪个Broker,kafka会通过METADATA请求获取集群的元数据,连接所有的Broker。
        (2)还可能在更新元数据后,或在消息发送时
    3 何时关闭TCP连接
        (1)Producer端关闭TCP连接的方式有两种:用户主动关闭,或kafka自动关闭。
            A:用户主动关闭,通过调用producer.close()方关闭,也包括kill -9暴力关闭。
            B:Kafka自动关闭,这与Producer端参数connection.max.idles.ms的值有关,默认为9分钟,9分钟内没有任何请求流过,就会被自动关闭。这个参数可以调整。
            C:第二种方式中,TCP连接是在Broker端被关闭的,但这个连接请求是客户端发起的,对TCP而言这是被动的关闭,被动关闭会产生大量的CLOSE_WAIT连接。
    展开

    作者回复: 总结得相当强:)

     1
     2
  • 旭杰
    2019-07-23
    Producer 通过 metadata.max.age.ms定期更新元数据,在连接多个broker的情况下,producer是如何决定向哪个broker发起该请求?

    作者回复: 向它认为当前负载最少的节点发送请求,所谓负载最少就是指未完成请求数最少的broker

    
     2
  • KEEPUP
    2019-07-02
    KafkaProducer 实例只是在首次更新元数据信息之后,创建与集群中所有 Broker 的 TCP 连接,还是每次更新之后都要创建?为什么要创建与所有 Broker 的连接呢?
     2
     2
  • 明翼
    2019-07-02
    我的想法这样的,先用客户端去连配置的第一broker server,连不上就连接第二个,一旦连上了,就可以获取元数据信息了,这是创建produce实例时候动作,只发起一个TCP连接。再send时候发现没连接的再连接,至于其他的都还是很合理的。
    
     2
  • JoeyLi666
    2019-07-04
    老师,最近使用kakfa,报了个异常:
    Caused by: org.apache.kafka.common.KafkaException: Record batch for partition Notify-18 at offset 1803009 is invalid, cause: Record is corrupt (stored crc = 3092077514, computed crc = 2775748463)
    kafka的数据还会损坏,不是有校验吗?

    作者回复: 也可能是网络传输过程中出现的偶发情况,通常没有什么好的解决办法。。。

     1
     1
  • 南辕北辙
    2019-07-03
    老师您好,我在本地分别用1.x版本和2.x版本的生产者去测试,为什么结果和老师的不一样呢。初始化KafkaProducer时,并没有与参数中设置的所有broker去建立连接,然后我sleep十秒,让sender线程有机会多运行会。但是还是没有看到去连接所有的broker。只有当运行到procuder.send时才会有Initialize connection日志输出,以及由于metadata的needUpdate被更新成true,sender线程会开始有机会去更新metadata去连接broker(产生Initialize connection to node...for sending metadata request)。之前学习源码的时候,也只注意到二个地方去连接broker(底层方法initiateConnect,更新metadata时建立连接以及发送数据时判断待发送的node是否建立了连接)。老师是我哪里疏忽了吗,还是理解有问题。翻阅老师的书上TCP管理这块貌似没有过多的讲解,求老师指导。。

    作者回复: 我不知道您这边是怎么实验的,但是我这边的确会创建新的TCP连接~~

    
     1
  • 张庆
    2019-07-02
    主要的资源浪费应该是在第一次获取元数据的时候创建所有的连接,应该是这个地方可以做一些优化吧,可以做一个最小初始化数量,从元数据中随机获取配置的最少数据,然后进行初始化。然后向Broker发送消息的时候在去判断,如果没有连接就创建连接,这样应该可以折中一下吧。
    
     1
  • 夏目-Steve
    2020-01-27
    connections.max.idle.ms 这个参数想确认一下, 是不是默认值为 600000 毫秒

    作者回复: Broker端和Client端都有这个参数。Broker端参数的默认值的确是10分钟,Client端的则不是。

    
    
  • 小马
    2020-01-09
    老师有个问题请教下:
    Producer 通过 metadata.max.age.ms 参数定期地去更新元数据信息,默认5分钟更新元数据,如果没建立TCP连接则会创建,而connections.max.idle.ms默认9分钟不使用该连接就会关闭。那岂不是会循环往复地不断地在创建关闭TCP连接了吗?

    作者回复: 如果你的producer长时间没有消息需要发送,TCP连接确实会定期关闭再重建的

    
    
  • 张伯毅
    2019-12-25
    整个集群 topic 的数量有限制嘛, 最大是多少 ?
    单台broker上分区数最好不要超过 2k . 这个是根据经验来的嘛,还是官方有推荐.??

    作者回复: 官方给的经验:) 最好还是结合自己实际场景而定

    
    
  • worry
    2019-10-06
    我觉得在创建KafkaProducer时就通过Sender线程与某些Broker创建连接的主要目的是获取集群元数据,不一定会和集群的所有broker创建连接。发送消息时,如果和leader节点没有连接就会创建,发送完消息如果没有数据要发送,连接就会被关闭释放资源。
    
    
  • rhwayfun
    2019-10-05
    Kafka强依赖zookeeper还是有很大风险的,之前公司就出现zookeeper被打挂的场景
     1
    
  • B+Tree
    2019-10-05
    第二章有写到:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。如果bootstrap.servers 参数中没有设置领导者副本地址,那么就得追随者副本同步数据到领导者副本?

    作者回复: bootstrap.servers设置的是连接Kafka的broker信息,和副本没有关系啊

    
    
  • 云师兄
    2019-09-30
    Kafka自动关闭连接,被动关闭的后果就是会产生大量的 CLOSE_WAIT 连接,当发起端被确认为空闲才会被被动关闭,理论数据传输量没有了,那为什么还有很多close wait?

    作者回复: 因为是被动关闭,所以才有CLOSE_WAIT,和是否有传输量关系不大

    
    
  • 有钱的包子
    2019-09-24
    老师有没有试卷题之类的

    作者回复: hmmm.... 我这边没有,网上倒是有一些面试题

    
    
  • cgddw
    2019-08-27
    broker有很多time_wait端口,甚至比established多,这是什么情况

    作者回复: 可能有很多clients端连接过该broker,而clients又都没有正常关闭所致

     1
    
我们在线,来聊聊吧