Kafka基于TCP进行通信

Kafka基于TCP进行通信

Apache Kafka 的所有通信都是基于 TCP 的,无论是生产者、消费者,还是 Broker 之间的通信都是如此。

生产者端的TCP管理

  • 何时建立TCP连接
    1. 在创建 KafkaProducer 实例时,生产者应用会在后台创建并启动一个名为 Sender 的线程,该 Sender 线程开始运行时首先会创建与 Broker 的连接(即使没有调用#send方法)

      具体来说,是Producer端的bootstrap.servers参数,指定了需要在启动时建立TCP连接的Broker地址,一般推荐设置3~5个为宜,不用全部设置,事实上只要和其中一个Broker建立了TCP连接,当前Producer是能够获取到集群所有Broker的信息的。

    2. 消息发送时,如果发现与某些Broker没有建立TCP连接,会建立TCP连接

    3. 更新集群元数据信息时也会建立TCP连接(比如Topic不存在时会发送METADATA请求给Kafka集群获取最新元数据信息)

  • 何时关闭TCP连接
    1. 用户主动关闭。(比如kill -9 或者调用close方法)
    2. Kafka自动关闭,对应Producer 端参数 connections.max.idle.ms。默认情况下该参数值是 9 分钟,即如果在 9 分钟内没有任何请求“流过”某个 TCP 连接,那么 Kafka 会主动帮你把该 TCP 连接关闭。注意,这个关闭是Broker端发起,Producer属于passive close(被动关闭),被动关闭的后果就是会产生大量的 CLOSE_WAIT 连接,因此 Producer 端或 Client 端没有机会显式地观测到此连接已被中断

消费者端的TCP管理

  • 何时建立TCP连接
    1. 在调用 KafkaConsumer.poll 方法时被创建TCP连接

      具体来说是围绕协调者进行的交互:

      • 发起 FindCoordinator 请求时。向Broker端发起 FindCoordinator 请求(建立TCP连接),寻找协调者所在Broker。
      • 连接协调者时。确定协调者所在Broker,建立TCP连接
      • 消费数据时。协调者分配好当前消费者消费的分区后,消费者需要与这些分区领导者副本所在的Broker建立TCP连接
  • 何时关闭TCP连接
    1. 用户主动关闭。(比如kill -9 或者调用close方法)
    2. Kafka自动关闭,对应消费者端参数 connection.max.idle.ms。默认情况下该参数值是 9 分钟,即如果在 9 分钟内没有任何请求“流过”某个 TCP 连接,消费者会强行“杀掉”这个 Socket 连接。
posted @ 2022-08-12 13:16  sixinshuier  阅读(668)  评论(0编辑  收藏  举报