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
idea搭建可运行Servlet的Web项目
Jun 26 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
新手初学Java List 接口
Jul 07 Java/Android
idea 在springboot中使用lombok插件的方法
Aug 02 Java/Android
java如何实现socket连接方法封装
Sep 25 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
SpringDataJPA在Entity中常用的注解介绍
Dec 06 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
Java完整实现记事本代码
Jun 16 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 Java/Android
Android实现图片九宫格
Jun 28 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 数组遍历foreach语法结构及实例
2016/06/13 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
PHP两种查询函数array/row的区别
2013/06/03 面试题
副总经理工作职责
2013/11/28 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
2014年创卫实施方案
2014/02/18 职场文书
团代会闭幕词
2015/01/28 职场文书
通知函的格式
2015/04/27 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
使用pytorch实现线性回归
2021/04/11 Python
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL