首页 > 其他分享 >Kafka为什么性能这么快?4大核心原因详解

Kafka为什么性能这么快?4大核心原因详解

时间:2022-09-20 09:58:35浏览次数:93  
标签:文件 缓存 性能 Kafka 详解 磁盘 拷贝 数据

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|分布式|高并发|架构师

 

标签:文件,缓存,性能,Kafka,详解,磁盘,拷贝,数据
From: https://www.cnblogs.com/mikechenshare/p/16709978.html

相关文章

  • kafka--Producer知识
    Producer发送模式同步发送异步发送异步发送回调Producer源码讲解Producer发送流程:1.构建对象2.发送消息KafkaProducer构建clientId,为了给metricConfig(上报......
  • 14 张图详解 Zookeeper + Kafka on K8S 环境部署
    转载自:https://www.cnblogs.com/liugp/p/16706192.html一、概述ApacheZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务,ZooKeeper致......
  • 数据结构算法与应用:C++语言描述(第2章 程序性能)
    目录2.1引言2.2空间复杂性(spaceComplexity)\(S_p(n)\)2.2.1空间复杂性的组成2.2.2举例2.3时间复杂性(timecomplexity)\(T(n)\)2.3.1时间复杂性的组成2.3.2操作计......
  • 数据结构算法与应用:C++语言描述(第2章 程序性能)
    目录2.1引言2.2空间复杂性(spaceComplexity)\(S_p(n)\)2.2.1空间复杂性的组成2.2.2举例2.3时间复杂性(timecomplexity)\(T(n)\)2.3.1时间复杂性的组成2.3.2操作计......
  • kafka-03-主题分区副本
    搭建一个主题,两个分区,三个副本环境搭建一个主题:1.创建topicexec-it先进入kafka容器,然后在/opt/kafka/bin目录下执行命令:用kafka的bin目录下的脚本:(往192.168.56.12......
  • 详解Python的装饰器
    来源  https://www.cnblogs.com/tobyqin/p/python-decorator.html Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里。为什么需要装饰......
  • Java高并发编程详解 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1_2jbvt1OecV4j3uN59DxYQ点击这里获取提取码 ......
  • synchronized锁详解
    synchronized的意义解决了Java共享内存模型带来的线程安全问题:如:两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次,结果是0吗?(针对这个问......
  • docker run的--rm选项详解
    在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。因此,可以通过--rm命令,让容器在退出时,自动清除挂载的卷,以便清除数据:另外,当容器退出时,通过......
  • linux命令详解:chmod
    说明全称:changemode作用:修改文件、目录的操作权限权限说明linux的文件调用权限分为三个组:所有者:全称Owner,简写u用户组:全称Group,简写g其它用户:全称OtherUsers,简......