消息队列总结(4)- RabbitMQ Kafka RocketMQ高性能方案

1.RabbitMQ的高性能解决方案

1.1 发布确认机制

RabbitMQ提供了3种生产者发布确认的模式:

  • 简单模式(Simple Mode):生产者发送消息后,等待服务器确认消息已经被接收。这种模式下,生产者发送消息后会阻塞,直到收到服务器确认消息。如果服务器在确认消息前崩溃,生产者会重新发送消息。​ 同步等待确认,实现简单,但是吞吐量十分有限

  • 批量模式(Batch Mode):生产者发送一批消息后,等待服务器一次性确认这批消息已经被接收。这种模式相比简单模式有更高的吞吐量,因为确认是批量进行的。批量同步等待确认,实现简单,吞吐量较大,但是很难找出未确认的消息,其中一个失败后需要把一个批次都重试。

  • 异步模式(Asynchronous Mode):生产者发送消息后,不会等待服务器的确认消息。而是通过回调函数来处理确认和错误信息。这种模式适用于对消息可靠性要求不高的场景,可以提高生产者的性能。​ 可靠性和性能最好,在出现未确认消息时容易处理,但是实现困难。

1.2 预取机制

RabbitMQ的默认分发方式是轮询分发,轮询分发的问题是会导致消费快的消费者空闲,消费慢的消费者一直干活。为了解决这个问题,RabbitMQ引入了不公平分发机制,可以把任务分发给空闲的消费者。

Channel channel = connection.createChannel();
channel.basicQos(1)

上面案例中方法basicQos的参数PrefetchCount(案例中等于1)是最大传输信息数,当消息由消费者消费完成之后,再次从Queue中获取消息,达到预取值。

  • PrefetchCount = 0:轮询分发
  • PrefetchCount = 1:不公平分发
  • PrefetchCount > 1:设置不公平分发,并设置预期值

通过预取值的机制可以减少消费者与磁盘之间的交换次数,从而提升消费者的处理能力。

2. Kafka的高性能解决方案

2.1 批量发送

 Producer会为每个Partition创建一个双端队列来缓存客户端的消息,队列中的每个元素是PorducerBatch,PorducerBatch的每个元素就是客户端要发送的Msg。

  1. KafkaProducer发送消息后,会先经过分区器判断发往哪个双端队列。
  2. 找到具体的双端队列后,先判断ProducerBatch是否已满,若满了则创建一个新的ProducerBatch,否则追加到以后的ProducerBatch中。

接下来sender线程工作机制是:

  1. 寻找ReadyNode:sender到消息累加器中轮询存在哪些Node已经准备好的ProducerBatch,只要一个Node有任何一个ProducerBatch准备好,这个Node就会被认为是ReadyNode。
  2. 创建Request:拿到所有的ReadyNode,寻找其中准备好的ProducerBatch,对于一个Node下的ProducerBatch打包成一个Request,其中一个Request最多包含的ProducerBatch由max.request.size控制。
  3. 发起通讯:然后每个Request通过Selector发起通讯。

sender把消息发送到Broker有两个条件:

  • 消息大小达到阈值(通常为1M,可以由message.max.bytes控制)
  • 消息发送等待时间达到阈值(默认为60000ms,可以由max.block.ms控制)

2.2 消息持久化

磁盘通查查询一条数据的过程如下:

  1. 磁头寻道:磁盘驱动器中的读写磁头会移动到指定的磁道上。磁道是磁盘表面的一个环形轨道,用于存储数据。

  2. 磁道选择:一旦到达正确的磁道,磁头会选择正确的扇区。扇区是磁道上的一个小块,用于存储数据。

  3. 磁头等待:一旦选择了正确的扇区,磁头会等待磁盘旋转到正确的位置。这是为了确保磁头在正确的时间读取或写入数据。

  4. 数据读取/写入:一旦磁盘旋转到正确位置,磁头会读取或写入数据。数据通过磁场变化在磁盘表面上进行存储和读取。

从上面的过程可以看出,如果我们查询/写入一条数据是随机在磁盘的一个位置,那么整个过程会比较耗时。对于Kafka来说,采用的策略是使用顺序IO,这样就可以避免寻址的过程,直接操作对数据的读/写操作。

2.3 零拷贝

 

 传统情况下,从磁盘读取数据,并通过网络发出去需要2次CPU copy和2次DMA copy:

  • 数据读取过程:DMA执行了一次数据拷贝,数据从磁盘拷贝到内核空间。cpu再将数据从内核空间拷贝到用户空间(用户缓冲区)。

  • 数据发送过程:cpu发生第三次数据拷贝,由cpu将数据从用户空间拷贝至内核空间(socket缓冲区),DMA执行第四次数据拷贝,将数据从内核空间写到网卡。

Linux2.4+的Linux系统支持了sendfile + DMA Gather

  • 发起一次sendfile()系统调用,进行一次上下文切换,数据从磁盘DMA copy到内核缓冲区。
  • 将内核缓冲区中带有文件位置、文件信息的缓冲区描述符copy到Socket缓冲区,然后借助DMA Gather真正的数据直接DMA copy到网卡。

这样只有两次上下文切换和两次DMA copy极大的减少了系统开支。 

3.RocketMQ的高性能解决方案

3.1 异步机制

RocketMQ在高性能上与Kafka类似,使用异步、批量、零拷贝的机制,来实现高吞吐量。具体RocketMQ的异步机制如下:

  • 数据写入CommitLog:Broker接收来自Producer发出的消息,获取CommitLog最新offset,并往CommitLog对应ByteBuffer追加数据。
  • 异步写磁盘:Broker通过同步/异步的方式写入到磁盘。若为异步写入磁盘,则是把数据写入OS的Page Cache就给Producer返回ACK,后台线程异步把Page Cache的数据写的磁盘。
  • 异步复制:Broker通过同步/异步的方式进行Master/Slave之间的数据同步。若为异步复制,则是数据写入Master成功即视为成功,再后台异步同步至其他Slave。
  • 异步写ConsumerQueue:后台线程轮询CommitLog的offset是否发生变化,若发生变化,则计算CommitLog对应消息的commitLog Offset、size、Message Tag HashCode写入ConsumerQueue。
  • 异步写IndexFIle:写入ConsumerQueue后,再将消息Key Hash、commitLog Offset、TimeStamp、Next Index Offset写入到到IndexFile。

(在RocketMQ中使用的批量发送、零拷贝等机制在上面已讲过,不再重复陈述)

4. 参考文档

Kafka由浅入深(6) Sender线程执行源码解析_kafka sender源码解析_架构源启的博客-CSDN博客

Kafka全面学习_kafka学习_oraen的博客-CSDN博客

零拷贝技术----sendfile_socket 零拷贝_不吃树叶的树袋熊的博客-CSDN博客

kafka-生产者源码解析_kafka request.timeout.ms_SnaiI的博客-CSDN博客

RocketMQ源码分析之消息写入_rocketmq 写入 json数据_不爱学习的小妞的博客-CSDN博客

RocketMQ源码解读四 Broker写入数据_python 从mq写入文件_colspanprince的博客-CSDN博客

Java 两种zero-copy零拷贝技术mmap和sendfile的介绍_sendfile和mmap的比较_刘Java的博客-CSDN博客

多图详解 kafka 生产者消息发送过程_kafka生产者发送消息_Java程序V的博客-CSDN博客

Rabbitmq消息队列详解_rabbitmq查看消息队列_☜阳光的博客-CSDN博客

【RabbitMQ】Producer之publisher confirm、transaction - 基于AMQP 0-9-1_穿越在未来的博客-CSDN博客

spring-rabbit消费过程解析及AcknowledgeMode选择_acknowledge-mode_JinchaoLv的博客-CSDN博客

RabbitMQ持久化机制_琦彦的博客-CSDN博客

rabbitmq基础8——持久化、存储机制、ETS、队列结构、消息状态、内存告警、磁盘告警_rabbitmq存储机制_百慕卿君的博客-CSDN博客

从数据存储分析RocketMQ的高性能设计_rocketmq性能_怪兽靠边闪的博客-CSDN博客

RabbitMQ、RocketMQ和Kafka之间有什么性能差距?_mq性能对比_Java技术攻略的博客-CSDN博客

计算机操作系统(二十二):磁盘_操作系统 磁盘转速 扇区_BKSW.的博客-CSDN博客

零拷贝技术:mmap和sendfile_零拷贝mmap和sendfile_johnny233的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习系统编程No.34【线程同步之信号量】

引言: 北京时间:2023/7/29/16:34,一切尽在不言中,前几天追了几部电视剧,看了几部电影,刷了n个视屏,在前天我们才终于从这快乐的日子里恢复过来,然后看了两节课,也就是上…

真机搭建中小网络

这是b站上的一个视频,演示了如何搭建一个典型的中小网络,供企业使用 一、上行端口:上行端口就是连接汇聚或者核心层的口,或者是出广域网互联网的口。也可理解成上传数据的端口。 二、下行端口:连接数据线进行下载的端…

Scratch Blocks自定义组件之「旋律播放」

一、背景 看到microbit edit有旋律编辑器,就在scratch块中也写了一个,如下图所示 这是我写的 这是Micro:bit的 二、功能配置说明 支持8个音符8拍旋律控制 三、使用说明 (1)引入添加field_tone.js到core文件夹中,代码在…

信息系统网络安全整改方案

第1章 项目概述 1.1 项目目标 本方案将通过对公司网络信息系统的安全现状进行分析工作,参照国家信息系统等级保护要求,找出信息系统与安全等级保护要求之间的差距,给出相应的整改意见,推动 XX 企业公司网络信息系统安全整改工作的…

计算机毕设 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

与“云”共舞,联想凌拓的新科技与新突破

伴随着数字经济的高速发展,IT信息技术在数字中国建设中起到的驱动和支撑作用也愈发凸显。特别是2023年人工智能和ChatGPT在全球的持续火爆,更是为整个IT产业注入了澎湃动力。那么面对日新月异的IT信息技术,再结合疫情之后截然不同的经济环境和…

【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】

前言 【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】一、相关准备工作1.1 用到的相关网址1.2 注册字节开发者后台账号 二、相关集成工作2.1 下载需要的集成资源2.2 安装StarkSDK和starksdk-unity-tools工具包2.3 搭建测试场景 三、构建发布3.1 发布…

【深度学习】MAT: Mask-Aware Transformer for Large Hole Image Inpainting

论文:https://arxiv.org/abs/2203.15270 代码:https://github.com/fenglinglwb/MAT 文章目录 AbstractIntroductionRelated WorkMethod总体架构卷积头Transformer主体Adjusted Transformer Block Multi-Head Contextual Attention Style Manipulation Mo…

探索Vue组件通信的秘密:打破隔阂,实现数据共享

一、Vue组件通信 每个组件都有自己的数据, 提供在data中, 每个组件的数据是独立的, 组件数据无法互相直接访问 (合理的)但是如果需要跨组件访问数据, 就需要用到组件通信 要是有一万个商品????就要写一万个吗?函数调用…

KubeSphere 3.4.0 发布:支持 K8s v1.26

2023 年 07 月 26 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.4.0 正式发布! 让我们先简单回顾下之前三个大版本的主要变化: KubeSphere 3.1.0 新增了“边缘计算”、“计量计费” 等功能,将 Kubernetes 从…

myeclipse的Debug模式

1.表示当前实现继续运行直到下一个断点,快捷键为F8。 2.表示打断整个进程 3.表示进入当前方法,快捷键为F5。 4.表示运行下一行代码,快捷键为F6。 5.表示退出当前方法,返回到调用层,快捷键为F7。 6.表示当前线程的…

kotlin 编写一个简单的天气预报app(五)增加forcast接口并显示

参考资料 OpenWeatherMap提供了一个/forecast接口,用于获取未来几天的天气预报。你可以使用HTTP GET请求访问该接口,并根据你所在的城市或地理坐标获取相应的天气数据。 以下是一个示例请求的URL和一些常用的参数: URL: http://api.openwe…

我的创作纪念日——256天

机缘 最开始我写博客没有什么特别的原因,主要是因为以下几点: 练习自己的语言组织能力 记录自己学习生活中学到的知识 为和我同一个学习阶段的朋友提供帮助 事实上最开始我根本不指望我的博客有多少人看,主要是想找一个好的保存 Markdown 笔…

花费7元训练自己的GPT 2模型

在上一篇博客中,我介绍了用Tensorflow来重现GPT 1的模型和训练的过程。这次我打算用Pytorch来重现GPT 2的模型并从头进行训练。 GPT 2的模型相比GPT 1的改进并不多,主要在以下方面: 1. GPT 2把layer normalization放在每个decoder block的前…

PHP最简单自定义自己的框架(一)

为啥要定义自己的框架: 定制化需求:每个项目都有不同的需求和特点,使用通用的框架可能无法满足所有的要求。自定义框架可以根据具体需求进行定制,提供更加灵活和符合项目需求的解决方案。学习和成长:自定义框架是一个很…

STM32存储左右互搏 I2C总线读写EEPROM ZD24C1MA

STM32存储左右互搏 I2C总线读写EEPROM ZD24C1MA 在较低容量存储领域,EEPROM是常用的存储介质,不同容量的EEPROM的地址对应位数不同,在发送字节的格式上有所区别。EEPROM是非快速访问存储,因为EEPROM按页进行组织,在连…

一文搞懂Redis架构演化之路

目录 从最简单的开始:单机版 Redis 数据持久化:有备无患 主从复制:多副本 哨兵:故障自动切换 分片集群:横向扩展 总结 这篇文章我想和你聊一聊 Redis 的架构演化之路。 现如今 Redis 变得越来越流行,…

图为科技加入深圳市智能交通行业协会 ,打 …

图为科技加入深圳市智能交通行业协会,打造智能交通新生态! 交通是国民经济发展的“大动脉”,交通拥堵、事故频发等问题不仅影响了人们的出行体验,也对经济的发展产生了负面影响。安全、高效、便捷的出行,一直是人们的…

【Unity实用插件篇】| 学会使用 可编程瓦片Tile Map,快速搭建2D地图

前言【Unity 实用插件篇】| 学会使用 可编程瓦片Tile Map,快速搭建2D地图一、导入 Tile Map Editor二、创建调色板 Tile Palette三、快速绘制地图四、TilePalette 调色板功能介绍五、TileMap 相关组件属性介绍GirdTilemapTilemap Renderer 瓦片地图渲染器Tile Assets 瓦片资源…

【Git】分支管理策略

文章目录 分支策略bug分支-master分支出现bug怎么办删除临时分⽀小结 分支策略 在实际开发中,我们应该按照⼏个基本原则进⾏分⽀管理: 1.master分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活 2.⼲活都在dev…