高并发场景下,Kafka如何抗住亿级流量?

Kafka是大型架构的核心,下面我重点详解Kafka高并发技术@mikechen

顺序写入

Kafka 将消息,以追加(append-only)方式写入磁盘文件。

这种顺序 I/O 相比随机 I/O 更高效,能充分利用磁盘吞吐。

高并发场景下,Kafka如何抗住亿级流量?-mikechen

如果你采用随机写, 磁头必须频繁、大幅度地移动,从一个轨道跳到另一个轨道来定位数据。

这个移动和定位的过程被称为寻道(Seeking),寻道操作通常需要 5 到 15 毫秒的时间,而这在 CPU 眼中是极度漫长的。

 而顺序写时,磁头一旦定位到起始位置,就可以保持不动或只是平滑、连续地移动,如同在一条轨道上持续读写。

磁头不需要进行昂贵的寻道操作,数据可以以介质的极限速度持续写入,因此效率极高。

 

Page Cache

Kafka 不直接频繁刷盘,而是依赖 Linux Page Cache,利用操作系统缓存批量写入。

如下图所示:

高并发场景下,Kafka如何抗住亿级流量?-mikechen

Producer 端支持 批量发送 + 压缩(gzip/snappy/lz4/zstd),减少网络传输开销。

Consumer 端也能批量拉取,降低网络请求次数。

实际效果:高效利用内存和批量传输,大幅提升整体吞吐。

 

 

批量发送与批量拉取

批量传输,生产者与 Broker 都支持将多条消息合并成批发送与写入。

从而,减少网络请求次数与 I/O 负载,提高吞吐效率。

高并发场景下,Kafka如何抗住亿级流量?-mikechen

以及,采用了压缩支持。

比如:对消息进行压缩,比如:zip、snappy、lz4…等等,进一步降低网络带宽占用并提高有效吞吐量。

 

零拷贝

Kafka在 Broker 将消息数据,从磁盘文件发送给 Consumer 时,采用了“零拷贝”技术。

利用操作系统的 sendfile() 等机制,避免了数据在内核空间和用户空间之间多次复制。

如下图所示:

高并发场景下,Kafka如何抗住亿级流量?-mikechen

传统 I/O 需要在 用户态 ↔ 内核态 ↔ 磁盘 之间多次拷贝数据。

Kafka 利用 sendfile 系统调用实现零拷贝,直接将磁盘文件的数据拷贝到 socket buffer,无需用户态中转。

这样,可以极大减少了 CPU 消耗和内存复制次数。

实际效果:Broker 消息转发时几乎不耗 CPU,支撑超大吞吐。

评论交流
    说说你的看法