Kafka基于TCP进行通信
Kafka基于TCP进行通信
Apache Kafka 的所有通信都是基于 TCP 的,无论是生产者、消费者,还是 Broker 之间的通信都是如此。
生产者端的TCP管理
-
何时建立TCP连接
-
在创建 KafkaProducer 实例时,生产者应用会在后台创建并启动一个名为 Sender 的线程,该 Sender 线程开始运行时首先会创建与 Broker 的连接(即使没有调用
#send
方法)。具体来说,是Producer端的
bootstrap.servers
参数,指定了需要在启动时建立TCP连接的Broker地址,一般推荐设置3~5个为宜,不用全部设置,事实上只要和其中一个Broker建立了TCP连接,当前Producer是能够获取到集群所有Broker的信息的。 -
消息发送时,如果发现与某些Broker没有建立TCP连接,会建立TCP连接。
-
更新集群元数据信息时也会建立TCP连接(比如Topic不存在时会发送METADATA请求给Kafka集群获取最新元数据信息)
-
-
何时关闭TCP连接
- 用户主动关闭。(比如kill -9 或者调用close方法)
- Kafka自动关闭,对应Producer 端参数
connections.max.idle.ms
。默认情况下该参数值是 9 分钟,即如果在 9 分钟内没有任何请求“流过”某个 TCP 连接,那么 Kafka 会主动帮你把该 TCP 连接关闭。注意,这个关闭是Broker端发起,Producer属于passive close(被动关闭),被动关闭的后果就是会产生大量的 CLOSE_WAIT 连接,因此 Producer 端或 Client 端没有机会显式地观测到此连接已被中断。
消费者端的TCP管理
-
何时建立TCP连接
-
在调用
KafkaConsumer.poll
方法时被创建TCP连接。具体来说是围绕协调者进行的交互:
- 发起 FindCoordinator 请求时。向Broker端发起 FindCoordinator 请求(建立TCP连接),寻找协调者所在Broker。
- 连接协调者时。确定协调者所在Broker,建立TCP连接
- 消费数据时。协调者分配好当前消费者消费的分区后,消费者需要与这些分区领导者副本所在的Broker建立TCP连接。
-
-
何时关闭TCP连接
- 用户主动关闭。(比如kill -9 或者调用close方法)
- Kafka自动关闭,对应消费者端参数
connection.max.idle.ms
。默认情况下该参数值是 9 分钟,即如果在 9 分钟内没有任何请求“流过”某个 TCP 连接,消费者会强行“杀掉”这个 Socket 连接。
不要小瞧女程序员