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 相关文章推荐
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
Jun 21 Java/Android
Java面试题冲刺第十九天--数据库(4)
Aug 07 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Java 数据结构七大排序使用分析
Apr 02 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java死锁的排查
May 11 Java/Android
Android RecyclerView实现九宫格效果
Jun 28 Java/Android
利用Java连接Hadoop进行编程
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基础知识:控制结构
2006/12/13 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
基于python实现微信模板消息
2015/12/21 Python
详解Python中类的定义与使用
2017/04/11 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
SQL面试题
2013/12/09 面试题
面包店的创业计划书范文
2014/01/16 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
社区维稳工作方案
2014/06/06 职场文书
采购部长岗位职责
2014/06/13 职场文书
python Tkinter模块使用方法详解
2022/04/07 Python
Python日志模块logging用法
2022/06/05 Python