Java中的Kafka为什么性能这么快及4大核心详析


Posted in Java/Android onSeptember 23, 2022

Java中的Kafka为什么性能这么快及4大核心详析

Kafka的性能快这是大厂Java面试经常问的一个话题,下面我就重点讲解Kafka为什么性能这么快的4大核心原因

1、页缓存技术

Kafka 是基于操作系统 的页缓存(page cache)来实现文件写入的,我们也可以称之为 os cache,意思就是操作系统自己管理的缓存。

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

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

Java中的Kafka为什么性能这么快及4大核心详析

2、磁盘顺序写

另一个主要功能是 kafka 写数据的时候,是以磁盘顺序写的方式来写的,也就是说仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。

为什么要采用磁盘顺序写?

完成一次磁盘 IO,需要经过寻道、旋转和数据传输三个步骤:

Java中的Kafka为什么性能这么快及4大核心详析

  • 寻道(时间):磁头移动定位到指定磁道;
  • 旋转延迟(时间):等待指定扇区从磁头下旋转经过;
  • 数据传输(时间):数据在磁盘、内存与网络之间的实际传输。

首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。

怎么样才能提高磁盘的读写效率呢?

即采用磁盘顺序写,这样就不需要寻道时间,只需很少的旋转时间,将数据追加到文件的末尾,不是在文件的随机位置来修改数据。

Java中的Kafka为什么性能这么快及4大核心详析

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

3、零拷贝

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

Java中的Kafka为什么性能这么快及4大核心详析

可以看到数据的拷贝从内存拷贝到 Kafka 服务进程那块,又拷贝到 Socket 缓存那块,整个过程耗费的时间比较高。

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

如下图所示:

Java中的Kafka为什么性能这么快及4大核心详析

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

4、分区分段+索引

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

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

到此这篇关于Java中的Kafka为什么性能这么快及4大核心详析的文章就介绍到这了,更多相关Java Kafka内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
教你用Java Swing实现自助取款机系统
Jun 11 Java/Android
Java方法重载和方法重写的区别到底在哪?
Jun 11 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
Java 语言中Object 类和System 类详解
Jul 07 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
Java网络编程之UDP实现原理解析
Sep 04 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
Java练习之潜艇小游戏的实现
Mar 16 Java/Android
SpringBoot2零基础到精通之异常处理与web原生组件注入
Mar 22 Java/Android
零基础学java之方法的定义与调用详解
Apr 10 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Mybatis 一级缓存和二级缓存原理区别
Sep 23 #Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 #Java/Android
Java获取字符串编码格式实现思路
Sep 23 #Java/Android
java获取一个文本文件的编码(格式)信息
Sep 23 #Java/Android
JDK8中String的intern()方法实例详细解读
Sep 23 #Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 #Java/Android
Spring Boot实现文件上传下载
Aug 14 #Java/Android
You might like
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
python面试题之列表声明实例分析
2019/07/08 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
使用python实现学生信息管理系统
2021/02/25 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
应届大学生自荐信格式
2013/09/21 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
学习雷锋活动总结
2014/04/29 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
药品开票员岗位职责
2015/04/15 职场文书
二审答辩状范文
2015/05/22 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS