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 相关文章推荐
分析Netty直接内存原理及应用
Jun 14 Java/Android
Feign调用全局异常处理解决方案
Jun 24 Java/Android
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
Spring整合Mybatis的全过程
Jun 28 Java/Android
分析并发编程之LongAdder原理
Jun 29 Java/Android
Java图书管理系统,课程设计必用(源码+文档)
Jun 30 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Android开发手册Chip监听及ChipGroup监听
Jun 10 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
python处理csv数据的方法
2015/03/11 Python
Django的Modelforms用法简介
2019/07/27 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
python实现电子词典
2020/03/03 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
复核员上岗演讲稿
2014/01/05 职场文书
电焊工岗位职责
2014/03/06 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
二十年同学聚会感言
2015/07/30 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
Python与C++中梯度方向直方图的实现
2022/03/17 Python
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技