Kafka 为什么这么快?PageCache、sendfile、顺序写盘——这些底层技术的巧妙组合成就了 Kafka 的超高吞吐。

一、Kafka 的 IO 模型

  • 1.1 基于磁盘的消息持久化——不是内存队列
  • 1.2 为什么用磁盘还能这么快——六字秘诀”顺序写 + 零拷贝”
  • 1.3 传统 IO 的 4 次拷贝 + 4 次上下文切换

二、零拷贝(Zero Copy)

  • 2.1 sendfile() 系统调用——DMA 直接传输
  • 2.2 2 次拷贝 + 2 次上下文切换
  • 2.3 mmap() 内存映射——另一种零拷贝
  • 2.4 Kafka 中的 FileChannel.transferTo()——Java 层面的零拷贝
  • 2.5 适用条件——不需要修改数据内容

三、PageCache 的读缓存

  • 3.1 操作系统的页面缓存
  • 3.2 读操作命中 PageCache——不需要走磁盘
  • 3.3 Kafka 消费者延迟消费的受益
  • 3.4 direct buffer 刷盘的时机——log.flush.interval.messages

四、顺序写盘

  • 4.1 机械硬盘的顺序写 vs 随机写——性能差 100 倍
  • 4.2 SSD 的顺序写 vs 随机写——差距缩小但仍显著
  • 4.3 Kafka 的日志结构——追加写,不可变
  • 4.4 分区内的顺序保证

五、分区与并行

  • 5.1 分区的并行处理能力
  • 5.2 消费组的并行消费
  • 5.3 分区数对吞吐的影响

六、批量与压缩

  • 6.1 Producer 的批量发送——batch.size / linger.ms
  • 6.2 消息压缩——gzip / snappy / lz4 / zstd
  • 6.3 压缩比与吞吐的权衡

七、ISR 机制与可靠性

  • 7.1 ISR(In-Sync Replicas)——同步副本列表
  • 7.2 ACK = 0 / 1 / -1(all) 三种确认级别
  • 7.3 min.insync.replicas——最少同步副本数

八、总结

  • 高性能的四大支柱:零拷贝 + PageCache + 顺序写 + 批量压缩
  • 这些设计如何协同工作