我画了一张大图来展示 kafka producer 发送消息的整个链路, 其中对消息提交、驻留、压缩再到使用 NIO 发送消息的整个过程做了详细拆解梳理;

整体架构鸟瞰

kafka 从使用者调用 KafkaProducer.send 方法, 到接收到 broker 的反馈并回调自己传入的 callback (如果设置的话), 整个过程是完全的, 彻底异步的, 甚至 kafka 根本就没有提供同步发送消息的 API, 这种纯粹而坚决的设计实乃消息队列领域的一股独流;
在打算撰写此文之前, 我看了不少分析 kafka producer 源码的文章, 大家都各有千秋, 不过遗憾的是, 我始终看不到一个真正打通全流程, 能让初学者读一遍就迅速了解 producer 各个核心模块 我们可以直观地看一下 kafka producer 消息流转的链路大图:

kafka 消息发送全流程
kafka 消息发送全流程

KafkaProducer 的主要结构:

1
KafkaProducer -> Sender(Runnable) -> KafkaClient(NetworkCLient) -> Selectable(org.apache.kafka.common.network.Selector) -> nioSelector

模块及其核心元素

kafka producer 运行的模式

Sender while(1) 循环, 逻辑时钟

架构拆解

异步提交消息

KafkaProducer 提交一条消息 (到缓冲区) 的异步过程:

1
KfakaProducer.send -> doSend -> accumulator.append -> deque.peekLast().append()

分配内存

消息的驻留与压缩

MAGIC_VALUE_V1: LegacyRecord
MAGIC_VALUE_V2: DefaultRecord

设置业务回调

消息发送的准备

设置 broker 响应回调

建立 TCP 连接

真正收发消息

broker 响应的处理

参考链接