Kafka是如何实现百万级高吞吐?

Kafka是大型架构的必备中间件,下面我就重点详解Kafka是如何实现百万级高吞吐@mikechen

顺序写磁盘

Kafka的持久化策略采用仅追加(append-only)的日志结构,所有消息严格按照到达顺序写入磁盘。

这种顺序写操作,极大避免了磁盘随机寻址开销,利用了磁盘顺序写入的超高速度。

Kafka是如何实现百万级高吞吐?

传统的机械磁盘在进行随机读写时,磁头需要频繁地在盘片上移动寻找目标扇区,这个寻道的过程耗时较长,严重影响了 I/O 性能。

而顺序写磁盘,顾名思义,是将数据按照写入的先后顺序,一块接着一块地写入到磁盘的连续区域。

这样磁头只需要很少的移动或者持续地向一个方向移动,大大减少了寻道时间和旋转延迟。

 

Page Cache

Page Cache 是操作系统内核在内存中开辟的一块区域,用于缓存磁盘上的数据。

当应用程序读取磁盘上的数据时,操作系统首先会检查 Page Cache 中是否存在所需数据。

如果存在(Cache Hit),则直接从内存中读取,速度非常快。

Kafka是如何实现百万级高吞吐?

Kafka写磁盘时,数据并不会立即刷到物理磁盘(sync操作)。

而是先写到操作系统提供的Page Cache(页缓存)。

OS内核负责将缓存中的数据批量刷盘(flush),减少频繁小IO,提高整体写入吞吐。

 

批量发送

频繁地发送单个小消息会产生大量的网络请求,每次请求都包含额外的头部信息和网络延迟,降低了整体的传输效率。

批量发送是指 Producer 将多个消息打包成一个较大的请求发送给 Broker。

Kafka是如何实现百万级高吞吐?

batch.size=16384  // 16KB批次大小  
linger.ms=5       // 最多等待5ms  
buffer.memory=33554432  // 32MB发送缓冲区  
compression.type=snappy  // 批次压缩

这样可以减少网络请求的次数,摊销每个消息的网络开销,从而提高吞吐量。

 

零拷贝

零拷贝技术:可以减少这些不必要的数据拷贝。

直接将数据从磁盘文件系统拷贝到网络套接字缓冲区,从而提高数据传输的效率,降低 CPU 的使用率。

Kafka是如何实现百万级高吞吐?

传统IO流程中,数据需要在磁盘 → 内核缓存 → 用户态缓存 → 网络缓冲区之间多次复制。

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

Kafka利用Zero-Copy技术,让数据直接从磁盘文件通过内核缓冲区发到网络,无需用户态拷贝。

通过这种方式,减少了数据拷贝的次数,可以显著提高传输性能。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧