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 相关文章推荐
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Java十分钟精通进阶适配器模式
Apr 06 Java/Android
Java虚拟机内存结构及编码实战分享
Apr 07 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
IDEA 2022 Translation 未知错误 翻译文档失败
Apr 24 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 Java/Android
Java实现HTML转为Word的示例代码
Jun 28 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
HttpClient实现表单提交上传文件
Aug 14 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
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
ant design实现圈选功能
2019/12/17 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
Python中除法使用的注意事项
2014/08/21 Python
Python多进程编程技术实例分析
2014/09/16 Python
python快速查找算法应用实例
2014/09/26 Python
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
Python调用JavaScript代码的方法
2020/10/27 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
C# .NET面试题
2015/11/28 面试题
在校生钳工实习自我鉴定
2013/09/19 职场文书
女大学生毕业找工作的自我评价
2013/10/03 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
安全生产先进个人总结
2015/02/15 职场文书
2015年少先队活动总结
2015/03/25 职场文书