Kafka如何实现百万级吞吐量和性能?

Kafka如何实现百万级吞吐量和性能?-mikechen

Kafka是高并发架构的核心,也是大厂重点考察对象,下面详解Kafka如何实现百万级高性能@mikechen

1、页缓存技术

页缓存技术是一种在操作系统中,用于优化磁盘“I/O性能”的重要技术。

Kafka 利用操作系统的页缓存技术,通过内存缓冲区高效地处理消息写入、和读取,减少磁盘 I/O 操作,提高系统的性能、和吞吐量。

kafka页缓存写入,如下图所示:

Kafka如何实现百万级吞吐量和性能?-mikechen

大致步骤,如下:

首先,Kafka将缓冲区中的消息,写入操作系统的页缓存(Page Cache)中。

备注:页缓存(Page Cache),由操作系统管理的内存区域,用于缓存即将写入磁盘的数据。

然后,是数据刷盘,页缓存中的数据,会被操作系统自身的机制刷入磁盘。

备注:Kafka 可以通过配置参数(如 log.flush.interval.messageslog.flush.interval.ms)来控制刷盘频率。

由于写入内存的速度远高于写入磁盘的速度,因此,使用页缓存能够显著减少磁盘I/O操作,提高写入性能。

 

2、磁盘顺序写

Kafka 的磁盘顺序写(sequential write),是其高性能、高吞吐量的关键技术之一。

Kafka 将消息,存储在分区(Partition)的日志文件中,这些日志文件是按照消息的顺序追加写入的。

如下图所示:

Kafka如何实现百万级吞吐量和性能?-mikechen

Kafka 使用追加写入的方式,将新消息写入日志文件的末尾,这种方式避免了随机写操作,最大化了磁盘写入效率。

要搞清楚追加写入“快”,这里的重点就是要理解:“为什么采用随机慢”?

采用顺序写入比随机写入更高效,因为磁盘不需要频繁地移动读写磁头,减少了寻道时间。

如下图所示:

Kafka如何实现百万级吞吐量和性能?-mikechen

 

机械硬盘采用磁头,在盘片上移动的方式进行读写操作,磁头需要移动到正确的磁道位置,这个过程称为寻道。

寻道操作需要花费的时间:取决于磁头的移动速度,和目标磁道、与当前磁头位置的距离。

而随机的情况,读写会导致磁头频繁移动到不同的位置进行寻道,这增加了寻道时间的累积和延迟。

所以,顺序写入比随机写入更高效,这也是Kafka实现高性能、和高吞吐量的另一个重要原因。

 

3、零拷贝

Kafka 使用零拷贝(Zero-Copy)技术,这种技术减少了数据在用户空间、和内核空间之间的拷贝次数。

如下图所示:

Kafka如何实现百万级吞吐量和性能?-mikechen

传统的数据传输过程,涉及多次数据拷贝,具体步骤如下:

  1. 首先,数据从磁盘读取到内核空间的缓冲区;
  2. 然后,从内核空间的缓冲区,拷贝到用户空间的缓冲区;
  3. 然后,从用户空间的缓冲区,再拷贝回内核空间的网络缓冲区;
  4. 最后,从内核空间的网络缓冲区发送到网络接口。

这些步骤中的每一次数据拷贝都会消耗 CPU 资源,拷贝技术通过减少数据拷贝次数来优化这一过程。

 

4、高效的网络通信

Kafka 使用高效的二进制协议进行网络通信,减少了数据编码、和解码的开销。

并且,Kafka 支持异步生产和消费消息,生产者和消费者可以并发处理消息,提高系统的并发性能。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法