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 Dubbo框架知识点梳理
Jun 26 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
java实现对Hadoop的操作
Jul 01 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
InterProcessMutex实现zookeeper分布式锁原理
Mar 21 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
详解Flutter和Dart取消Future的三种方法
Apr 07 Java/Android
Java Spring Boot 正确读取配置文件中的属性的值
Apr 20 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
java.util.NoSuchElementException原因及两种解决方法
Jun 28 Java/Android
spring boot实现文件上传
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
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
详解python之配置日志的几种方式
2017/05/22 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
Python中psutil的介绍与用法
2019/05/02 Python
python地震数据可视化详解
2019/06/18 Python
python numpy存取文件的方式
2020/04/01 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
生产厂厂长岗位职责
2013/12/25 职场文书
县级文明单位申报材料
2014/05/23 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
政风行风评议工作总结
2014/10/21 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
升学宴学生答谢词
2015/01/05 职场文书
学术会议领导致辞
2015/07/29 职场文书
Oracle中日期的使用方法实例
2022/07/07 Oracle