当前位置: 首页 > 后端技术 > Java

为什么卡夫卡这么快?4大核心原因详解

时间:2023-04-02 00:51:04 Java

Kafka性能快是各大厂商Java面试中经常被问到的话题。下面我将重点讲解Kafka性能如此之快的4个核心原因@mikechen1。页面缓存技术Kafka是基于操作系统的页面缓存(pagecache)来实现文件写入的,我们也可以称之为oscache,意思是操作系统自己管理的缓存。Kafka在写入磁盘文件时,可以直接写入os缓存,也就是只写入内存,然后由操作系统决定何时真正将os缓存中的数据刷入磁盘文件。通过这一步,可以大大提高磁盘文件写入的性能,因为实际上这相当于写入内存,而不是写入磁盘。原理图如下:2.磁盘顺序写入的另一个主要功能是kafka写数据的时候。采用磁盘顺序写入的方式写入,即只在文件末尾追加数据,不在文件中随机位置修改数据。为什么要使用磁盘顺序写入?完成一次磁盘IO需要寻道、旋转、数据传输三个步骤:寻道(时间):磁头移动定位到指定磁道;rotationdelay(time):等待指定扇区在磁头下旋转;数据传输(时间):数据在磁盘、内存和网络之间的实际传输。首先要找到柱面,即磁头需要移动到对应的轨道上。这个过程称为寻道,所花费的时间称为寻道时间。然后目标扇区在头下旋转,这个过程所花费的时间称为旋转时间。怎样才能提高磁盘的读写效率呢?也就是说,磁盘是顺序写入的,因此不需要寻道时间,只需要少量的旋转时间。数据附加到文件的末尾,而不是在文件中的随机位置修改数据。.基于以上两点,Kafka实现了写入数据的超高性能。3、零拷贝先来看一下非零拷贝,如下图所示:可以看到数据从内存拷贝到Kafka服务进程,再拷贝到Socket缓存。整个过程需要很长时间。Kafka使用了Linux的sendFile技术(NIO),省去了进程切换和一次数据拷贝,性能更好,如下图所示:采用零拷贝技术,无需将os缓存中的数据拷贝到应用程序缓存从应用程序缓存复制到Socket缓存。两个副本都被省略,所以称为零副本。4.Partitionandsegment+indexKafka的消息是按照topic分类存储的,topic中的数据按照partition一个一个的存储在不同的broker节点中。每个分区对应操作系统上的一个文件夹,分区实际上是分段存储的。通过这种partition和segment的设计,Kafka的消息实际上是按照一个个小的segment进行分发和存储的,每次文件操作也是直接操作一个segment。为了进一步优化查询,Kafka默认为分片后的数据文件创建一个索引文件,即文件系统上的.index文件。这种分区和段+索引的设计,不仅提高了数据读取的效率,也提高了数据操作的并行性。以上作者简介陈睿|mikechen,10年+大工厂架构经验,《BAT架构技术500期》系列文章作者,分享十余年BAT架构经验和面试心得!阅读mikechen收集的更多互联网架构Java并发|JVM|MySQL|Spring|Redis|分布式|高并发|架构师关注“mikechen的互联网架构”公众号,回复【架构】获取我的原创《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》