Kafka 高性能原理
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 + 顺序写 + 批量压缩
- 这些设计如何协同工作
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!