Kafka是大型架构的必备中间件,下面我就重点详解Kafka是如何实现百万级高吞吐@mikechen
顺序写磁盘
Kafka的持久化策略采用仅追加(append-only)的日志结构,所有消息严格按照到达顺序写入磁盘。
这种顺序写操作,极大避免了磁盘随机寻址开销,利用了磁盘顺序写入的超高速度。

传统的机械磁盘在进行随机读写时,磁头需要频繁地在盘片上移动寻找目标扇区,这个寻道的过程耗时较长,严重影响了 I/O 性能。
而顺序写磁盘,顾名思义,是将数据按照写入的先后顺序,一块接着一块地写入到磁盘的连续区域。
这样磁头只需要很少的移动或者持续地向一个方向移动,大大减少了寻道时间和旋转延迟。
Page Cache
Page Cache 是操作系统内核在内存中开辟的一块区域,用于缓存磁盘上的数据。
当应用程序读取磁盘上的数据时,操作系统首先会检查 Page Cache 中是否存在所需数据。
如果存在(Cache Hit),则直接从内存中读取,速度非常快。

Kafka写磁盘时,数据并不会立即刷到物理磁盘(sync操作)。
而是先写到操作系统提供的Page Cache(页缓存)。
OS内核负责将缓存中的数据批量刷盘(flush),减少频繁小IO,提高整体写入吞吐。
批量发送
频繁地发送单个小消息会产生大量的网络请求,每次请求都包含额外的头部信息和网络延迟,降低了整体的传输效率。
批量发送是指 Producer 将多个消息打包成一个较大的请求发送给 Broker。

batch.size=16384 // 16KB批次大小 linger.ms=5 // 最多等待5ms buffer.memory=33554432 // 32MB发送缓冲区 compression.type=snappy // 批次压缩
这样可以减少网络请求的次数,摊销每个消息的网络开销,从而提高吞吐量。
零拷贝
零拷贝技术:可以减少这些不必要的数据拷贝。
直接将数据从磁盘文件系统拷贝到网络套接字缓冲区,从而提高数据传输的效率,降低 CPU 的使用率。

传统IO流程中,数据需要在磁盘 → 内核缓存 → 用户态缓存 → 网络缓冲区之间多次复制。
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
Kafka利用Zero-Copy技术,让数据直接从磁盘文件通过内核缓冲区发到网络,无需用户态拷贝。
通过这种方式,减少了数据拷贝的次数,可以显著提高传输性能。