Java KafkaProducer生产者是如何管理TCP连接的? 何时建立?何时关闭?





为什么使用TCP?

Apache Kafka 的所有通信都是基于 TCP 的,而不是基于HTTP 或其他协议。无论是生产者、消费者,还是 Broker之间的通信都是如此。你可能会问,为什么 Kafka 不使用HTTP 作为底层的通信协议呢?其实这里面的原因有很多,但最主要的原因在于 TCP 和 HTTP 之间的区别。从社区的角度来看。

  • TCP能提供一些高级功能比如多路复用以及同时轮询多个连接。
  • 目前的HTTP库在很多编程语言中都略显简陋。



在什么时候会建立TCP连接?

  1. TCP 连接是在创建KafkaProducer 实例时建立的 对Broker集群进行连接,和所有的Broker都会产生TCP连接,是否浪费资源。
  2. 一个是在更新集群的元数据后 当 Producer 更新了集群的元数据信息之后,如果发现与某些 Broker 当前没有连接,那么它就会创建一个 TCP 连接
  3. 另一个是在消息发送时 发送消息时,Producer 发现尚不存在与目标 Broker 的连接,也会创建一个

更新集群的元数据在何时发生

  1. 当 Producer 尝试给一个不存在的主题发送消息时,Broker 会告诉 Producer 说这个主题不存在。此时Producer 会发送 METADATA 请求给 Kafka 集群,去尝试获取最新的元数据信息。

  2. Producer 通过 metadata.max.age.ms 参数定期地去更新元数据信息。该参数的默认值是 300000,即 5 分钟,也就是说不管集群那边是否有变化,Producer 每 5 分钟都会强制刷新一次元数据以保证它是最及时的数据。




何时关闭TCP ,最好如何关闭

主动关闭,这样最好

 producer.close()

被动关闭 Producer 端参数connections.max.idle.ms

  • 当这个参数设置大于0 ,就会在几分钟内没有请求自动关闭。
  • 设置成 -1,TCP 连接将成为永久长连接。

版权声明:本文为jj89929665原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。