跳转至

Kafka 高吞吐原理


Kafka 能达到百万级 TPS,依赖四个核心机制:

mindmap
    root((Kafka 高吞吐))
        顺序写磁盘
            磁盘顺序写速度接近内存
            避免随机 IO
        零拷贝 sendfile
            数据不经过用户态
            减少 CPU 拷贝次数
        批量发送
            多条消息合并为一批
            减少网络请求次数
        消息压缩
            GZIP/Snappy/LZ4/ZSTD
            减少网络传输量

1. 顺序写磁盘

随机写:磁头需要寻道 → 速度约 100 MB/s
顺序写:磁头不需要移动 → 速度约 600 MB/s(接近内存速度)

Kafka 每个 Partition 对应一个日志文件,消息只追加写入(Append Only)
为什么这样设计:消息队列天然是追加写入的,不需要修改已有数据,
顺序写完美契合这个场景,比随机写快 6 倍

2. 零拷贝(Zero Copy)

传统文件传输(4次拷贝,2次 CPU 介入):
磁盘 → 内核缓冲区 → 用户缓冲区 → Socket 缓冲区 → 网卡

零拷贝 sendfile(2次拷贝,0次 CPU 介入):
磁盘 → 内核缓冲区 → 网卡(跳过用户态,减少 CPU 介入)

为什么这样设计:Kafka 消费者只是读取数据转发,不需要在用户态处理数据,
跳过用户态拷贝可以减少 CPU 使用和内存带宽消耗

3. 批量发送与压缩

// 生产者批量发送配置
props.put("batch.size", 16384);          // 批次大小(字节),默认 16KB
// 为什么是 16KB:经验值,太小则批次频繁发送,太大则延迟增加
props.put("linger.ms", 5);               // 等待时间(ms),凑满批次或超时则发送
// 为什么是 5ms:在延迟和吞吐量之间取平衡,5ms 对大多数业务可接受
props.put("compression.type", "snappy"); // 压缩算法(snappy 压缩率高且速度快)

4. 四大机制对比

机制 原理 提升效果
顺序写磁盘 Append Only,避免磁头寻道 写速度提升 6 倍(100→600 MB/s)
零拷贝 sendfile 跳过用户态 减少 2 次数据拷贝,降低 CPU 消耗
批量发送 多消息合并一次网络请求 减少网络 RTT,提升吞吐
消息压缩 GZIP/Snappy/LZ4/ZSTD 减少网络传输量,降低带宽消耗

5. 压缩算法选择

算法 压缩率 速度 适用场景
GZIP 对压缩率要求高,CPU 资源充足
Snappy 推荐,压缩率和速度均衡
LZ4 最快 对延迟敏感的场景
ZSTD Kafka 2.1+ 支持,综合性能最佳