【消息队列】Kafka如何实现高性能IO

news2025/1/17 3:43:39

我们直到Kafka是一个自称高性能的消息队列引擎,一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手,而消息从产生到消费,也会经历多个流程,比如在生产者端采用异步\同步方式发送,采用高效的压缩算法,高效的序列化方式,以及网络IO等。那么Kafka主要实现高性能IO的。

批量消息发送

我们直到通过send方法,不管是同步还是异步方式,消息都会直接先暂存到内存中,然后等够一批数据消息后,才会发送到broker端,而Broker端不会将消息进行拆解,而是按照一个批量消息为一个单位进行处理,我们假设处理一个单条消息到Broker端需要1ms,那么需要1S中最多处理1000个消息,但是如果是批量发送,那么1S中处理的消息肯定是对于1000个消息的。因为这个途中会涉及本地IO、网络IO、数据拷贝等。
构建批消息和解开批消息分别在发送端和消费端的客户端完成,不仅减轻了 Broker 的压力,最重要的是减少了 Broker 处理请求的次数,提升了总体的处理能力。

顺序读写提升磁盘 IO 性能

我们直到磁盘顺序读写要比随机读写速度快很多,最根本的是可以减少寻址操作。

Kafka也利用这个顺序读写的机制,来提升IO性能,在消息发送到Broker的时候,会按照分区 将消息顺序写到Log文件中,而消费者在消费的时候,也是按照log文件进行读。当一个文件写完或者读完就会生成下一个文件。
充分利用了顺序读写这个特性,极大提升了 Kafka 在使用磁盘时的 IO 性能。

PageCache 加速消息读写

在 Kafka 中,它会利用 PageCache 加速消息读写。PageCache 是现代操作系统都具有的一项基本特性。通俗地说,PageCache 就是操作系统在内存中给磁盘上的文件建立的缓存。无论我们使用什么语言编写的程序,在调用系统的 API 读写文件的时候,并不会直接去读写磁盘上的文件,应用程序实际操作的都是 PageCache,也就是文件在内存中缓存的副本。
在这里插入图片描述
写数据流程,应用程序在写入数据的时候,先将数据写入到PageCache中,然后在一批批写入到磁盘中。
读数据流程,一个是pageCache中有数据,直接返回。没有数据从磁盘中读取到数据后,写入到pageCahce中,这个之后从pageCache读取数据。
数据淘汰算法,采用LRU 可以将最近写入的数据,提升读的能力。
Kafka 在读写消息文件的时候,充分利用了 PageCache 的特性。一般来说,消息刚刚写入到服务端就会被消费,按照 LRU 的“优先清除最近最少使用的页”这种策略,读取的时候,对于这种刚刚写入的 PageCache,命中的几率会非常高。

也就是说,大部分情况下,消费读消息都会命中 PageCache,带来的好处有两个:一个是读取的速度会非常快,另外一个是,给写入消息让出磁盘的 IO 资源,间接也提升了写入的性能

ZeroCopy:零拷贝技术

我们直到服务端Broker在处理消费时候,会先从磁盘上读取数据,如果命中pageCache的话 直接返回,然后将数据读取到应用程序中,通过网络socket发送出去。

未使用零拷贝

  • 先从磁盘读取数据,如果数据在pageCache中返回,没有从磁盘读取。写入到用户缓冲区。然后将用户缓冲区数据写到socket缓冲区,最后写到网卡缓冲区。
    在这里插入图片描述

使用零拷贝

从图中可以得知 可以把数据直接从pageCache中写到Socke缓冲区中,减少1/2次数据拷贝的过程,而这就是DMA技术,
在这里插入图片描述

小结

本篇主要介绍了Kafka的高性能IO设计,其实本质上都是从计算、存储、网络三个方面进行入手。而高性能的目的是实现高吞吐量,以及提升系统的并发容量。而高可用则是避免出现单点故障,通过服务冗余、分片、分区等方式实现系统的可用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb03 Cookie和Session

一个网站怎么证明你来过? 1.首次访问时服务器给客户端一个cookie,下次客户端再次访问会自动携带cookie,注意cookie可以是多个 2.首次访问时服务器登记了客户端一系列信息,下次客户端再进行访问时服务器自动匹配此客户端是否访问…

Win10搭建我的世界Minecraft服务器「内网穿透远程联机」

文章目录1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址9. 使用固定公网地址远程联机转载…

Mac远程控制工具有哪些

适用于Mac的远程控制工具有很多,这里我们给大家列举五个常用软件。 1、Apple Remote Desktop 苹果自带远程桌面正如其名称所承诺的那样。作为 Apple 出品的应用程序,您可以想象它的配置和上手是多么容易。从 App Store 下载 Apple Remote Desktop 后&a…

ThreadPoolExecutor获取原始异常

ThreadPoolExecutor作用 ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现,它是基于Java的ThreadPoolExecutor实现的。ThreadPoolTaskExecutor可以管理线程池中的线程,以满足多线程并发执行任务的需要。 FutureTask作用 FutureTask的主要作用…

自动化篇 | 13 | app自动化:airtest

1 airtes简介 1.1 参考地址 http://airtest.netease.com/ # airtest官网 https://airtest.doc.io.netease.com/ # airtest操作方法 https://airtest.doc.io.netease.com/IDEdocs/faq/1_code_examples/ # 代码示例2 airtest架构 Airtest框架 3 airtest使用 3.1 打开界…

【C语言】猜数字游戏的实现

简单不先于复杂,而是在复杂之后。 目录 1.思路(代码会附在最后面) 2.随机数函数rand 1.思路(代码会附在最后面) 首先实现一个猜数字游戏我们先要有一个思路:1.产生一个随机数 2.猜数字 3.可能猜大了 4.可能…

java简单一写一个springboot入门案例

首先 我们先打开idea编辑器 然后 选择File New>Project… 项目的话 我们选择 Spring lnitializr 右边的路径要改一下 然后 选择好路径之后 一定要要在后面加上 \项目名 例如 我这里 选择了 D盘下的学习案例下的springbootDom 项目名叫 threshold 那就这样配置 java版本选…

探索【PhySO】

目录0、 初步报错情况1、230、 初步报错情况 根据原链接,已确定安装成功,运行demo时出现报错,不能正常运行 报错: .Dummy epoch time 238.366736 ms .Dummy epoch time (w duplicate elimination) 180.852427 ms (found 15/1…

【结构型模式】代理模式

文章目录优秀借鉴1、简介2、结构3、实现方式3.1、案例引入3.2、静态代理3.3、JDK动态代理3.4、CGLIB动态代理4、区别对比4.1、静态代理和动态代理4.2、JDK动态代理和CGLIB动态代理5、代理模式优缺点6、应用场景优秀借鉴 设计模式(四)——搞懂什么是代理…

线段树的懒标记

上次看的那个视频讲线段树的时候压根没讲懒标记,然后我今天去写题目直接被薄纱!都是70分,剩下3个节点tml!!! 懒标记 我们在修改一些区间的时候,按照我昨天来学的来修改要改到最下面的叶节点去…

Visual Studio如何将UTF-8字符串输出到控制台

解决c语言使用libcurl库时控制台输出中文出现乱码的问题。 字符编码问题一直以来都是Windows系统的诟病,而Visual Studio也是饱受此诟病。由于历史原因,Windows系统对各个不同的国家地区可能采用不同的code page。由于早先Unicode并未发展成熟&#xff0…

Java设计模式之工厂模式

什么是工厂模式 工厂模式就是将创建对象的具体过程和使用过程分开,这样能够使代码更加灵活。 工厂模式主要分为三类: 简单工厂模式工厂方法模式抽象工厂模式 比如在没有工厂的时候,用户需要一台奥迪车,那么就需要用户去创建一台…

【java 多线程】并发设计模式-两阶段终止模式(对interrupt的理解)

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

惊艳!阿里出品“Java全栈进阶宝典”,广度与深度齐头并进

前言 据有关数据统计,目前来看,大大小小的招聘网站上面,Java岗的招聘量仍然是最多的,基本是其他语言的3倍以上,由于目前Java所处的统治级地位,单就数量来看,Java语言实现的系统是海量的&#x…

linux安装MongoDB

环境说明 系统CentOS:CentOS7 mongodb版本 4.2.24 下载 官网下载地址 Download MongoDB Community Server | MongoDB 某云盘 链接:https://pan.baidu.com/s/1G4AC3h5rvz9WM3fx4gJzbA 提取码:ojkl 上传解压 在根目录下创建opt文件夹…

【数据分析之道-基础知识(九)】推导式

文章目录专栏导读1、前言2、列表推导式3、集合推导式4、字典推导式5、元组推导式专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》,本专栏针对大学生、初级数据分…

C语言学习1--------Visual Studio集成开发环境的搭建

C语言学习1--------Visual Studio集成开发环境的搭建适合初学者适用集成开发环境下载 Visual Studio 2019安装 Visual Studio 2019安装工作负载为C自定义安装位置激活 Visual Studio适合初学者适用集成开发环境 建议初学者适用最新的——Visual Studio 2019为集成开发环境。 部…

【数据库原理 • 五】数据库安全性与完整性

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

【C++11那些事儿(一)】

文章目录一、C11简介二、列表初始化2.1 C98中{}的初始化问题2.2 C11中的列表初始化三、各种小语法3.1 auto3.2 decltype3.3 nullptr3.4 范围for四、STL中的一些变化五、左/右值引用和移动语义(本篇重点)5.1 做值引用和右值引用5.2 左值引用与右值引用比较…

【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表

【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表😎前言🙌复制带随机指针的链表🙌画图分析:😍思路分析:😍源代码分享:😍总结撒花💞😎博客昵…