Kafka为什么快(高性能的原因)

我们知道,Kafka 是基于磁盘存储的,但它却又具有高性能、高吞吐、低延时等特点,吞吐量可达几十上百万。那么 Kafka 这么快的原因是什么呢?

Kafka 高性能主要取决于以下几方面:
(1)消息批处理+压缩传输
(2)顺序写磁盘 + PageCache
(3)零拷贝技术
(4)分区分段+索引

 

1、消息批处理及压缩传输
(1)批处理
Kafka内部,消息都是以“批”为单位处理的,Kafka的客户端SDK在实现消息发送逻辑的时候,采用了异步批量发送的机制。

当调用 send() 方法发送一条消息后,无论是同步还是异步发送,Kafka 并不会立刻将该条消息发出去,它会先把它存在内存,然后选择合适的时机(涉及两个参数)把缓存的所有消息组成一批,一次性的发给Broker。

Broker端在数据处理过程中,无论是写磁盘、读磁盘读出来、还是复制消息到其他副本,都是以批进行(批不会被解开为一条一条消息)处理的。

消费时,消息同样是以批为单位,Consumer 从 Broker 拉到一批消息后,在客户端把批消息解开,再一条条的交给用户代码处理。

由此,构建和解开批消息分别在发送端和消费端的客户端完成,减轻了 Broker 的压力,也减少了 Broker 处理请求的次数,提升了整体的吞吐能力。

producer 端涉及两个批处理参数:
batch.size:消息条数积累到该阈值,立即发送.
linger.ms:不管消息有没有积累足够条数,超过该时间就立即发送

(2)压缩传输
默认情况下,在 Kafka 生产者中不启用消息压缩(compression.type参数来控制压缩方式)。因为压缩虽然可以减少网络带宽消耗和存储空间,但也会增加 CPU 的负担。

在 Kafka 中,压缩可能会发生在两个地方:生产者端和 Broker 端,一句话总结下压缩和解压缩,即 Producer 端压缩,Broker 端保持,Consumer 端解压缩。

Kafka 支持多种压缩算法:lz4、snappy、gzip,从 Kafka 2.1.0 开始新增了 ZStandard 算法,该算法是 Facebook 开源的压缩算法,能提供超高的压缩比。

Producer、Broker、Consumer 要使用相同的压缩算法,在 Producer 向 Broker 写入数据,Consumer 向 Broker 读取数据的时候可以不用解压缩,只需要在最终 Consumer 到消息的时候才进行解压缩,这样可以节省大量的网络和磁盘开销。

 
2、顺序写磁盘 + PageCache
Kafka 为了保证磁盘写入性能,通过基于操作系统的页缓存来实现文件写入的。操作系统本身有一层缓存,叫做 page cache,是在内存里的缓存,也可以称之为 os cache,意思就是操作系统自己管理的缓存。那么在写磁盘文件的时候,就可以先直接写入 os cache 中,也就是仅写入内存中,接下来由操作系统自己决定什么时候把 os cache 里的数据真正刷入到磁盘,这样大大提高写入效率和性能。

另外还有个关键操作,就是 kafka 在写数据的时候是以磁盘顺序写的方式来进行落盘的,即将数据追加到文件的末尾,而不是在文件的随机位置来修改数据,对于普通机械磁盘,如果是随机写的话,涉及到磁盘寻址的问题,导致性能极低,但是如果只是按照顺序的方式追加文件末尾的话,这种磁盘顺序写的性能基本可以跟写内存的性能相差无几。

 
3、零拷贝技术
(1)传统拷贝流程
在这里插入图片描述

流程步骤:
(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;
(2)应用程序将数据从内核空间读入用户空间缓冲区;
(3)应用程序将读到数据写回内核空间放入 socket 缓冲区;
(4)操作系统将数据从 socket 缓冲区复制到网卡接口,然后数据通过网络发送。

可以看出,上述过程涉及到 4 次数据的复制,并且有两次复制操作是由 CPU 完成。但这个过程中,数据完全没有变化,仅仅是从磁盘复制到网卡缓冲区。

 
(2)零拷贝流程
在这里插入图片描述

 

可以看到,使用零拷贝技术把上面第2、3步的两次复制合并成一次。直接从 PageCache 中将数据复制到 Socket 缓冲区,这不仅减少了复制次数,且由于不用把数据复制到用户内存空间,DMA 控制器就可以直接完成数据复制,不需要CPU 的参与,速度更快。

 
4、分区分段 + 索引
Kafka 中的消息是按 topic 分类存储的,topic 中的数据又是按照一个一个分区(partition)存储到不同的 broker 节点上。每个 partition 对应操作系统上的一个文件夹,每个 partition 数据是以追加方式写入到一个有序的日志文件中。

这个日志文件实际上是由多个日志段(segment)文件组成。
每个 segment 文件都是一个独立的文件,它包含一定数量的消息。随着新消息不断追加,旧的 segment 文件会根据清理策略最终被删除。
 

在这里插入图片描述
 

通过这种分区分段的设计,Kafka 的消息最终相当于是分布式存储在一个个小的 segment 中,每次文件操作也是直接操作 segment。

同时,为了进一步的查询优化,Kafka 又默认为分段后的数据文件建立了索引文件(index文件)。通过索引文件,Kafka 可以快速定位特定偏移量的消息,而不需要遍历整个日志。

这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据操作的并行度。

 
 
 
 
 
 

大佬,点个赞再走呗!

 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501816.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站,按照下图所示即可生成高质量的视频,同时,我们也提供了简单易用的 API 方便集成调用,可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术,实现了上面的图…

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式:{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…

Excel VBA 自动填充空白并合并相同值的解决方案

文章目录 Excel VBA: 自动填充空白并合并相同值的解决方案问题背景解决方案1. VBA代码实现2. 代码说明3. 使用方法4. 注意事项 扩展优化总结 Excel VBA: 自动填充空白并合并相同值的解决方案 问题背景 在Excel中经常会遇到这样的数据处理需求:一列数据中存在多个空…

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候,这时候网络助手以客户端的模式连接到esp8266,其中IP地址写的是esp8266作为服务器时的IP地址,可以使用ATCIFSR查询esp8266的ip地址,端口号默认写333。 当esp8266作为服务器的时候,需要完成哪些…

JavaScript性能

随着应用规模的增长,JavaScript 性能的优化变得尤为重要。这篇文章将分享 10 个实用的优化技巧,帮助开发者提升前端性能。 减少 DOM 操作 操作 DOM 是性能瓶颈。将多个操作合并到一个操作中,或者使用虚拟 DOM(如 React&#xff…

组网实训实现

小型单元网络实现 IP划分: 外网:172.1.1.0/24 172.1.2.0/24 内网:基于192.168.3.0/24的子网划分 综合办公楼:192.168.3.00 000000 /26(192.168.3.0-192.168.3.63) 综合一楼:192.168.3.0000 0000 /28&…

GIT 企业级开发学习 1_基本操作

本节主要命令: git init ls 不能列出 .git ls -a 列出 .git 创建本地仓库 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库,在当前目录下生成一个 .git 隐藏文件夹,用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls …

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者:来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布,它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记

1.LPI(Locality-specific Peripheral Interrupts)是一种基于消息的中断(Message Signaled Interrupt,MSI),由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理&am…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念,所以直接整理可能用到的东西。 sd简单的说…

性能测试03|JMeter:断言、关联、web脚本录制

目录 一、断言 1、响应断言 2、json断言 3、持续时间断言 二、关联 1、正则表达式介绍 2、正则表达式提取器 3、Xpath提取器 4、JSON提取器 5、JMeter属性 三、web脚本录制 一、断言 定义:让程序自动判断实际的返回结果是否与预期结果保持一致 自动校验…

GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程20241231

GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程 快速导航 引言Fork 与 Clone 概念对比完整开发流程Pull Request 最佳实践常见问题与解决方案最佳实践建议实战案例 引言 在开发者的协作世界中,GitHub 就像一座桥梁,连…

『 Linux 』高级IO (三) - Epoll模型的封装与EpollEchoServer服务器

文章目录 前情提要Epoll 的封装Epoll封装完整代码(供参考) Epoll Echo ServerEpoll Echo Server 测试及完整代码 前情提要 在上一篇博客『 Linux 』高级IO (二) - 多路转接介绍并完成了两种多路转接方案的介绍以及对应多路转接方案代码的编写,分别为SelectServer服务器与PollSe…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

Docker安装Prometheus和Grafana

概念简述 安装prometheus 第一步:确保安装有docker 第二步:拉取镜像 第三步:准备相关挂载目录及文件 第四步:启动容器 第五步:访问测试 安装grafana 第一步:确保安装有docker 第二步:拉…

UE5失真材质

渐变材质函数:RadialGradientExponential(指数径向渐变) 函数使用 UV 通道 0 来产生径向渐变,同时允许用户调整半径和中心点偏移。 用于控制渐变所在的位置及其涵盖 0-1 空间的程度。 基于 0-1 的渐变中心位置偏移。 源自中心的径…

Android授权USB使用权限示例

使用效果&#xff1a; 授权实现过程&#xff1a; 1.在AndroidManifest.xml中增加android.hardware.usb.action.USB_DEVICE_ATTACHED的action及meta-data action: <action android:name"android.hardware.usb.action.USB_DEVICE_ATTACHED"/> meta-data: &l…

matlab时频分析库

time frequency gallery

算法题(25):只出现一次的数字(三)

审题&#xff1a; 该题中有两个元素只出现一次并且其他元素都出现两次&#xff0c;需要返回这两个只出现一次的数&#xff0c;并且不要求返回顺序 思路: 由于对空间复杂度有要求&#xff0c;我们这里不考虑哈希表。我们采用位运算的方法解题 方法&#xff1a;位运算 首先&#…

python +tkinter绘制彩虹和云朵

python tkinter绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…