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连接。