Kafka是大型架构的核心,下面我重点详解Kafka高并发技术@mikechen
顺序写入
Kafka 将消息,以追加(append-only)方式写入磁盘文件。
这种顺序 I/O 相比随机 I/O 更高效,能充分利用磁盘吞吐。
如果你采用随机写, 磁头必须频繁、大幅度地移动,从一个轨道跳到另一个轨道来定位数据。
这个移动和定位的过程被称为寻道(Seeking),寻道操作通常需要 5 到 15 毫秒的时间,而这在 CPU 眼中是极度漫长的。
而顺序写时,磁头一旦定位到起始位置,就可以保持不动或只是平滑、连续地移动,如同在一条轨道上持续读写。
磁头不需要进行昂贵的寻道操作,数据可以以介质的极限速度持续写入,因此效率极高。
Page Cache
Kafka 不直接频繁刷盘,而是依赖 Linux Page Cache,利用操作系统缓存批量写入。
如下图所示:
Producer 端支持 批量发送 + 压缩(gzip/snappy/lz4/zstd),减少网络传输开销。
Consumer 端也能批量拉取,降低网络请求次数。
实际效果:高效利用内存和批量传输,大幅提升整体吞吐。
批量发送与批量拉取
批量传输,生产者与 Broker 都支持将多条消息合并成批发送与写入。
从而,减少网络请求次数与 I/O 负载,提高吞吐效率。
以及,采用了压缩支持。
比如:对消息进行压缩,比如:zip、snappy、lz4…等等,进一步降低网络带宽占用并提高有效吞吐量。
零拷贝
Kafka在 Broker 将消息数据,从磁盘文件发送给 Consumer 时,采用了“零拷贝”技术。
利用操作系统的 sendfile()
等机制,避免了数据在内核空间和用户空间之间多次复制。
如下图所示:
传统 I/O 需要在 用户态 ↔ 内核态 ↔ 磁盘 之间多次拷贝数据。
Kafka 利用 sendfile
系统调用实现零拷贝,直接将磁盘文件的数据拷贝到 socket buffer,无需用户态中转。
这样,可以极大减少了 CPU 消耗和内存复制次数。
实际效果:Broker 消息转发时几乎不耗 CPU,支撑超大吞吐。