Kafka核心技术与实战Day18Java生产者是如何管理TCP连接的?

81 阅读2分钟

为何采用TCP?

Apache Kafka的所有通信都是基于TCP的, 而不是基于HTTP或其他协议. 为什么不使用HTTP协议作为底层的通讯协议呢? 其实里面的原因有很多, 但最主要的原因在于TCP和HTTP之间的区别.

从社区的角度来看, 在开发客户端时, 人们能够利用TCP本身提供的一些高级功能, 比如多路复用请求以及同时轮询多个连接的能力.

所谓多路复用请求, 即multiplexing request, 是指将两个或多个数据流合并到底层单一物理连接中的过程. TCP的多路复用请求会在一条物理连接上创建若干个虚拟连接, 每个虚拟连接负责流转各自的数据流.

更严谨地说, 作为一个基于报文的协议, TCP能够被用于多路复用场景的前提是, 上层 的应用协议(比如HTTP) 允许发送多条消息.

除了TCP提供的这些的高级功能有可能被Kafka酷护短的开发人员使用外, 社区还发现, 目前已知的HTTP库在很多编程语言中略显简陋.

基于这两个原因, Kafka决定采用TCP协议作为所有请求通信的底层协议.

Kafka生产者程序概览

Kafka的Java生产者API主要的对象就是KafkaProducer. 通常我们开发一个生产者的步骤有4步.

第1步: 构造生产者对象所需要的参数对象.

第2步: 利用第1步的参数对象, 创建KafkaProducer对象实例.

第3步: 使用KafkaProducer的send方法发送消息.

第4步: 调用KafkaProducer的close方法关闭生产者并释放各种系统资源.

何时创建TCP连接?

生产者应用在创建 KafkaProducer 实例时是会建立与 Broker 的 TCP 连接的。其实这种表述也不是很准确,应该这样说:在创建 KafkaProducer 实例时,生产者应用会在后台创建并启动一个名为 Sender 的线程,该 Sender 线程开始运行时首先会创建与 Broker 的连接。

TCP 连接还可能在两个地方被创建:一个是在更新元数据后,另一个是在消息发送时

何时关闭TCP连接?

Producer端关闭TCP连接的方式有两种: 一种是用户关闭, 一种是Kafka自动关闭.

此文章为3月Day18学习笔记, 内容来源于极客时间《Kafka核心技术与实战》, 强烈推荐该课