我画了一张大图来展示 kafka producer 发送消息的整个链路, 其中对消息提交、驻留、压缩再到使用 NIO 发送消息的整个过程做了详细拆解梳理;
整体架构鸟瞰
kafka 从使用者调用 KafkaProducer.send 方法, 到接收到 broker 的反馈并回调自己传入的 callback (如果设置的话), 整个过程是完全的, 彻底异步的, 甚至 kafka 根本就没有提供同步发送消息的 API, 这种纯粹而坚决的设计实乃消息队列领域的一股独流;
在打算撰写此文之前, 我看了不少分析 kafka producer 源码的文章, 大家都各有千秋, 不过遗憾的是, 我始终看不到一个真正打通全流程, 能让初学者读一遍就迅速了解 producer 各个核心模块 我们可以直观地看一下 kafka producer 消息流转的链路大图:
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
: LegacyRecordMAGIC_VALUE_V2
: DefaultRecord