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 相关文章推荐
ConstraintValidator类如何实现自定义注解校验前端传参
Jun 18 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
Java 多线程协作作业之信号同步
May 11 Java/Android
利用正则表达式匹配浮点型数据
May 30 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
Jun 16 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
前端与RabbitMQ实时消息推送未读消息小红点实现示例
Jul 23 Java/Android
Java使用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
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
将php数组输出html表格的方法
2014/02/24 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
JavaScript中的闭包
2016/02/24 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
Python 发送邮件方法总结
2020/08/10 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
文明倡议书范文
2014/04/15 职场文书
大学生实训报告总结
2014/11/05 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
Python图片检索之以图搜图
2021/05/31 Python