乐趣区

关于java:Kafka为什么性能这么快4大核心原因详解

Kafka 的性能快这是大厂 Java 面试常常问的一个话题,上面我就重点解说 Kafka 为什么性能这么快的 4 大外围起因 @mikechen

1、页缓存技术

Kafka 是基于操作系统 的页缓存 (page cache) 来实现文件写入的,咱们也能够称之为 os cache,意思就是操作系统本人治理的缓存。

Kafka 在写入磁盘文件的时候,能够间接写入这个 os cache 里,也就是仅仅写入内存中,接下来由操作系统本人决定什么时候把 os cache 里的数据真的刷入磁盘文件中。

通过这一个步骤,就能够将磁盘文件写性能晋升很多了,因为其实这里相当于是在写内存,不是在写磁盘,原理图如下:

2、磁盘程序写

另一个次要性能是 kafka 写数据的时候,是以磁盘程序写的形式来写的,也就是说仅仅将数据追加到文件的开端,不是在文件的随机地位来批改数据。

为什么要采纳磁盘程序写?

实现一次磁盘 IO,须要通过寻道、旋转和数据传输三个步骤:

  1. 寻道(工夫):磁头挪动定位到指定磁道;
  2. 旋转提早(工夫):期待指定扇区从磁头下旋转通过;
  3. 数据传输(工夫):数据在磁盘、内存与网络之间的理论传输。

首先必须找到柱面,即磁头须要挪动对准相应磁道,这个过程叫做寻道,所消耗工夫叫做寻道工夫,而后指标扇区旋转到磁头下, 这个过程消耗的工夫叫做旋转工夫。

怎么样能力进步磁盘的读写效率呢?

即采纳磁盘程序写,这样就不须要寻道工夫,只需很少的旋转工夫,将数据追加到文件的开端,不是在文件的随机地位来批改数据。

基于下面两点,kafka 就实现了写入数据的超高性能。

 

3、零拷贝

先来看看非零拷贝的状况,如下图所示:

能够看到数据的拷贝从内存拷贝到 Kafka 服务过程那块,又拷贝到 Socket 缓存那块,整个过程消耗的工夫比拟高。

Kafka 利用了 Linux 的 sendFile 技术(NIO),省去了过程切换和一次数据拷贝,让性能变得更好,如下图所示:

通过 零拷贝技术,就不须要把 os cache 里的数据拷贝到利用缓存,再从利用缓存拷贝到 Socket 缓存了,两次拷贝都省略了,所以叫做零拷贝。

4、分区分段 + 索引

Kafka 的 message 是按 topic 分 类存储的,topic 中的数据又是依照一个一个的 partition 即分区存储到不同 broker 节点。每个 partition 对应了操作系统上的一个文件夹,partition 实际上又是依照 segment 分段存储的。

通过这种分区分段的设计,Kafka 的 message 音讯实际上是分布式存储在一个一个小的 segment 中的,每次文件操作也是间接操作的 segment。为了进一步的查问优化,Kafka 又默认为分段后的数据文件建设了索引文件,就是文件系统上的.index 文件。这种分区分段 + 索引的设计,不仅晋升了数据读取的效率,同时也进步了数据操作的并行度。
以上

作者简介

陈睿 |mikechen,10 年 + 大厂架构教训,《BAT 架构技术 500 期》系列文章作者,分享十余年 BAT 架构教训以及面试心得!

浏览 mikechen 的互联网架构更多技术文章合集

Java 并发 |JVM|MySQL|Spring|Redis| 分布式 | 高并发 | 架构师

关注「mikechen 的互联网架构」公众号,回复 【架构】 支付我原创的《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》

退出移动版