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实现分布式事务的三种方案
Jun 11 Java/Android
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
Java集成swagger文档组件
Jun 28 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
Jul 16 Java/Android
关于springboot 配置date字段返回时间戳的问题
Jul 25 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
Apr 13 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
Android开发手册TextInputLayout样式使用示例
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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
新浪的图片新闻效果
2007/01/13 Javascript
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
用javascript实现点击链接弹出"图片另存为"而不是直接打开
2007/08/15 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
python中实现php的var_dump函数功能
2015/01/21 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
十个Python程序员易犯的错误
2015/12/15 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
优秀毕业生推荐信范文
2014/03/07 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
财务工作个人总结
2015/02/27 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
退税申请报告怎么写
2015/05/18 职场文书
地道战观后感2000字
2015/06/04 职场文书
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技