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 相关文章推荐
Spring Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
springBoot基于webSocket实现扫码登录
Jun 22 Java/Android
springcloud之Feign超时问题的解决
Jun 24 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
使用springMVC所需要的pom配置
Sep 15 Java/Android
java代码实现空间切割
Jan 18 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Java实现经典游戏泡泡堂的示例代码
Apr 04 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Apr 08 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 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数组内部指针操作函数
2010/10/12 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
好的Python培训机构应该具备哪些条件
2018/05/23 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
护理学应聘自荐书范文
2014/02/05 职场文书
超市国庆节促销方案
2014/02/20 职场文书
财产保全担保书范文
2014/04/01 职场文书
工会换届选举方案
2014/05/21 职场文书
学校开学标语
2014/10/06 职场文书
刑事附带民事代理词
2015/05/25 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python