Kafka 的 Java 生产者是如何管理 TCP 连接的?
为何采用 TCP?
-
Apache Kafka 的所有通信都是基于 TCP 的,而不是基于 HTTP 或其他协议。
- 在开发客户端时,能够利用 TCP 本身提供的一些高级功能,比如多路复用请求以及同时轮询多个连接的能力。
- 除了 TCP 提供的这些高级功能有可能被 Kafka 客户端的开发人员使用之外,目前已知的 HTTP 库在很多编程语言中都略显简陋。
Kafka 生产者程序概览
- Kafka 的 Java 生产者 API 主要的对象就是 KafkaProducer。
- 通常我们开发一个生产者的步骤有 4 步。
- 第 1 步:构造生产者对象所需的参数对象。
- 第 2 步:利用第 1 步的参数对象,创建 KafkaProducer 对象实例。
- 第 3 步:使用 KafkaProducer 的 send 方法发送消息。
- 第 4 步:调用 KafkaProducer 的 close 方法关闭生产者并释放各种系统资源。
Properties props = new Properties (); props.put(“参数1”, “参数1的值”); props.put(“参数2”, “参数2的值”); …… try (Producer<String, String> producer = new KafkaProducer<>(props)) { producer.send(new ProducerRecord<String, String>(……), callback); …… }
何时创建 TCP 连接?
- 当我们开发一个 Producer 应用时,生产者会向 Kafka 集群中指定的主题(Topic)发送消息,这必然涉及与 Kafka Broker 创建 TCP 连接。
- TCP 连接是在创建 KafkaProducer 实例时建立的。在创建 KafkaProducer 实例时,生产者应用会在后台创建并启动一个名为 Sender 的线程,该 Sender 线程开始运行时首先会创建与 Broker 的连接。
- 理论上,Sender 线程完全能够观测到一个尚未构造完成的 KafkaProducer 实例。当然,在构造对象时创建线程没有任何问题,但最好是不要同时启动它。
- bootstrap.servers 参数
- 它是 Producer 的核心参数之一,指定了这个 Producer 启动时要连接的 Broker 地址。
- 如果你为这个参数指定了 1000 个 Broker 连接信息,那么你的 Producer 启动时会首先创建与这 1000 个 Broker 的 TCP 连接。
- Producer 一旦连接到集群中的任一台 Broker,就能拿到整个集群的 Broker 信息,故没必要为 bootstrap.servers 指定所有的 Broker。
- TCP 连接还可能在两个地方被创建:一个是在更新元数据后,另一个是在消息发送时。
- 当 Producer 更新了集群的元数据信息之后,如果发现与某些 Broker 当前没有连接,那么它就会创建一个 TCP 连接。
- 同样地,当要发送消息时,Producer 发现尚不存在与目标 Broker 的连接,也会创建一个。
何时关闭 TCP 连接?
- Producer 端关闭 TCP 连接的方式有两种:一种是用户主动关闭;⼀种是 Kafka 自动关闭。
- 第一种主动关闭实际上是广义的主动关闭,甚至包括用户调用 kill -9 主动“杀掉”Producer 应用。当然最推荐的方式还是调用 producer.close() 方法来关闭。
- 第二种是 Kafka 帮你关闭,这与 Producer 端参数 connections.max.idle.ms 的值有关。默认情况下该参数值是 9 分钟,即如果在 9 分钟内没有任何请求“流过”某个 TCP 连接,那么 Kafka 会主动帮你把该 TCP 连接关闭。
文章来源地址https://www.toymoban.com/news/detail-515843.html
文章来源:https://www.toymoban.com/news/detail-515843.html
到了这里,关于《kafka 核心技术与实战》课程学习笔记(十)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!