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框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
详解JAVA的控制语句
Nov 11 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
spring cloud eureka 服务启动失败的原因分析及解决方法
Mar 17 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
Mar 31 Java/Android
Java 关于String字符串原理上的问题
Apr 07 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
Android存储中最基本的文件存储方式
Apr 30 Java/Android
Java版 简易五子棋小游戏
May 04 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
mysql 全文搜索 技巧
2007/04/27 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
如何编写jquery插件
2017/03/29 jQuery
SpringMVC简单整合Angular2的示例
2017/07/31 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
浅谈Vue的响应式原理
2019/05/30 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
Python类的继承用法示例
2019/01/31 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
个人职业生涯规划书1500字
2013/12/31 职场文书
效能风暴心得体会
2014/09/04 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
教师节横幅标语
2014/10/08 职场文书
公积金具结保证书
2015/05/11 职场文书
班主任工作总结范文
2015/08/13 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书