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实战之用Swing实现通讯录管理系统
Jun 13 Java/Android
总结一下关于在Java8中使用stream流踩过的一些坑
Jun 24 Java/Android
Java Dubbo框架知识点梳理
Jun 26 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
Java数据开发辅助工具Docker与普通程序使用方法
Sep 15 Java/Android
MybatisPlus EntityWrapper如何自定义SQL
Mar 22 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
Java GUI编程菜单组件实例详解
Apr 07 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
springboot读取nacos配置文件
May 20 Java/Android
Java 多线程并发FutureTask
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
10条PHP编程习惯助你找工作
2008/09/29 PHP
基于jquery 的一个progressbar widge
2010/10/29 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
深入理解python函数递归和生成器
2016/06/06 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
Python定时任务sched模块用法示例
2018/07/16 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
学生实习推荐信范文
2013/11/26 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
迎新晚会主持词
2014/03/24 职场文书
美食节策划方案
2014/05/26 职场文书
高中同学会活动方案
2014/08/14 职场文书
市场总监岗位职责
2015/02/11 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技