引言:

kafka为什么这么快?这是一个非常经典的 Kafka 高频面试题,也是可以帮助我们深入了解kafka的各种机制,本文将详细介绍这个经典问题

一、提升磁盘 I/O杀手锏三兄弟

操作系统对 顺序读写 + Page Cache + 异步刷盘 做了极致优化。聪明的系统设计者不再“对抗”磁盘,而是“顺应”硬件和内核机制。

1.顺序写入磁盘

传统认知:内存 > SSD > 磁盘,但 Kafka 打破常规:顺序写磁盘 ≈ 随机写内

原理:
  • Kafka 将消息追加(append-only)到 Partition 的日志文件末尾。
  • 操作系统对 顺序写 有极强优化(预读、合并、延迟写入页缓存)。
  • 实测:现代磁盘顺序写速度可达 600MB/s,远超随机写(<100KB/s)
效果:
  • 极大提升吞吐量,减少 I/O 瓶颈。
  • 即使不依赖内存缓存,也能高效写入。

2.零拷贝

传统 I/O 流程(非零拷贝):

磁盘 → 内核缓冲区 → 用户缓冲区 → Socket 缓冲区 → 网卡

 Kafka 使用 sendfile() 实现零拷贝:

磁盘 → 内核缓冲区 → 网卡(直接发送,不经过用户态)

数据在内核态直接传输,CPU 不参与数据搬运。整体只有 2 次上下文切换,性能提升显著

3.页缓存

Kafka 不自己管理缓存,而是依赖 OS Page Cache

优势:
  • 消息写入时:先写入 Page Cache,异步刷盘(flush 策略可配)
  • 消息读取时:直接从 Page Cache 读取,避免磁盘 I/O
  • 避免了 JVM 堆内存占用和 GC 压力

4.其他中间件对比

不止 Kafka,几乎所有高性能、涉及磁盘 I/O 的分布式中间件或存储系统(如 RocketMQ、ClickHouse、Redis AOF、LevelDB、RocksDB、etcd、Pulsar 等),都广泛采用了这三种技术

中间件

顺序写

零拷贝

页缓存

说明

Kafka




典型代表,全量使用

RocketMQ




CommitLog 顺序写,ConsumeQueue 索引分离

RocksDB / LevelDB


⚠️部分


LSM-Tree 架构本质就是顺序写 WAL 和 SSTable

Redis

✅(AOF)



AOF 日志追加写,依赖 Page Cache 提升性能

Mysql




Redo Log和Binlog都是顺序写入,同时也是依赖 Page Cache 提升性能

ZooKeeper




事务日志 txnlog 追加写,快照定期 dump

二、批量处理 —— 提升吞吐,降低开销

Kafka 在生产、存储、消费各个环节都采用批量操作:

环节

批量机制

Producer

多条消息打包成 Batch,减少网络请求次数

Broker

接收 Batch 批量写入日志,顺序写更高效

Consumer

一次 poll() 拉取多条消息,减少网络往返

 效果:

  • 网络请求数量下降 90%+
  • 吞吐量成倍提升

三、 分区并行 ——水平扩展的基础

  • Topic 被分为多个 Partition,每个 Partition 独立写读。
  • 并行度 = Partition 数量
  • 多个 Producer 可同时写不同分区
  • 多个 Consumer 可在 Group 内并发消费

四、简洁的二进制协议 + 批量压缩

(1) 二进制协议
  • Kafka 使用自定义二进制协议(非 JSON/XML),消息头小、解析快。
  • 减少网络带宽和 CPU 解析开销。
(2) 批量压缩(Compression)
  • Producer 可对整个 Batch 进行压缩(compression.type=snappy|lz4|zstd
  • 压缩后再发送,减少网络传输量
  • Broker 存储压缩数据,Consumer 解压

总结:Kafka 高性能全景图

技术

作用

对应性能提升

顺序写磁盘

利用磁盘顺序写高速特性

写入吞吐高

零拷贝(sendfile)

减少数据拷贝和上下文切换

读取高效,CPU 低

页缓存(Page Cache)

利用 OS 缓存,避开 JVM GC

读写更快,更稳定

批量处理

减少网络请求和系统调用

吞吐量倍增

分区并行

支持水平扩展

可扩展性强

批量压缩

减少网络传输

带宽利用率高