消息队列 - RabbitMQ

news2025/7/18 4:17:17

1. 名词解释

Producer:生产者

Broker:接收和分发消息的应用

Connection:生产者和消费者与 Broker 之间的 TCP 连接

Channel:信道;在 Connection 内部建立的逻辑连接,每个 Channel 之间是相互隔离的。相当于数据库的连接池,不必每次访问都建立连接,减少系统的开销

Routing Key:路由规则;用于交换机识别将消息推送至哪个队列中

Exchange:交换机,负责消息的分发;消息到达 Broker 后,首先流转至交换机。然后根据制定的消息分发规则,去查询表中匹配消息中的 Routing Key,然后将消息推送至队列中

Queue:队列;在交换机中找到对应的 Routing Key 后,消息就流转到队列中,等待被消费

Binding:Exchange 和 Queue 之间的虚拟连接,连接中可以包含相应的 Routing Key,连接中用于匹配 Routing Key 的信息会被保存到 Exchange 的查询表中,用于消息的分发

Virtual host:虚拟主机;当不同的用户使用同一个 RabbitMQ 服务时,将不同的用户划分在不同的虚拟主机中,每一台主机之间互不干扰

Consumer:消费者

2. 基础架构

根据上面的描述,我们可以得到一个大概的 RabbitMQ 架构图

在这里插入图片描述

3. 常用交换机类型

3.1 Direct Exchange

直连交换机

一个队列会和一个交换机绑定,然后再绑定一个 Routing Key
消息在被发送时,要 Binding 一个 Routing Key
当消息送达到交换机之后,会在查询表中找到对应 Routing Key 的队列,然后将交换机推送至队列中

在这里插入图片描述

3.2 Fanout Exchange

扇形交换机

广播一样,将消息发送到与之绑定的全部队列中

在这里插入图片描述

3.3 Topic Exchange

主题交换机

按本人的理解,主题交换机是直连交换机的升级版
主题交换机是让 Routing Key 按照一定的匹配规则去匹配交换机中的多个队列
也就是说,一个 Message 可以发送至多个队列中

但是,Routing Key 不能随意编写,要满足一定的要求
首先他必须是一个单词列表,以点号分开

规则:

  • 【*】 用于匹配一个单词
  • 【#】用于匹配多个单词

当交换机中的队列绑定键是【#】,那么交换机中这个队列将接收所有数据,类似于上述的扇形交换机
当交换机中的队列绑定键当中没有【#】和【*】出现,那么交换机中这个队列将只会接收和他唯一对应 Routing Key 的数据,类似于上述的直连交换机

在这里插入图片描述

3.4 Header Exchange

头交换机

不依赖于 Routing Key 的匹配规则
匹配机制是匹配消息头中的属性信息

在 Message、Queue 与 Exchange 进行 Binding 之前,会声明一个键值对对象,通过这个键值实现 Message、Queue 与 Exchange 的绑定

当 Message 发送到 MQ 时,会将 Message 中的 Headers 信息取出,与 Exchange 绑定时使用的键值对进行匹配


匹配规则有两种类型:

  • x-match = all :表示所有的键值对都匹配才能接受到消息
  • x-match = any :表示只要存在一个键值对匹配就能接受到消息

在这里插入图片描述

4. 发送数据

  1. 在 RabbitMQ 中,Producer 不会知道 Message 是否已经被推送到 Queue 中,他们的工作只是将消息推送至 Exchange 中

  2. Exchange 的工作也很简单,一边接收 Producer 的消息,一边查找查询表的路由规则,将消息推送至 Queue 中

5. 保存数据

5.1 消息分类

消息有两种类型:持久化消息非持久化消息;两种消息都会被写入磁盘中
非持久化消息:一般只存于内存中,当内存不足且又还没被消费时,才会被写入磁盘,以节省内存空间
持久化消息:在被推送到队列时写入磁盘,同时会在内存中进行备份;当内存不足时,消息就会被清理掉

5.2 存储层

RabbitMQ 存储层包含两个部分:队列索引和消息存储

在这里插入图片描述

5.2.1 队列索引 rabbit_queue_index

用于记录队列中所有 Message 的信息,信息包括:存储的地点,是否已经被推送至消费者等

每个队列都有相对应的 index

使用顺序的段文件来存储
段文件的意思就是,系统把一个逻辑空间分为若干个段,每个段都有他自己的一组逻辑意义
段的长度由相应的逻辑信息的长度来决定,也就是说,各个段的长度是不同的;在这一点上,分段是比较灵活的。因为分页存储,页的大小是固定的,只要空间不够,就会将数据切割开来,不会考虑逻辑信息是否完整。在编程和使用的方面来说,不够灵活

5.2.2 消息存储 rabbit_msg_store

键值的形式存储消息
所有队列共享同一个 rabbit_msg_store
持久化消息的持久化非持久化消息的持久化由 rabbit_msg_store 来进行

使用文件来进行存储 ,经过 rabbit_msg_store 处理的所有消息,都是以文件追加的方式写入文件中;当超过文件的限制大小之后,就会关闭该文件,然后新建一个文件继续进行写入

要注意的是,写入文件的操作也不是立刻执行的
在写入文件之前,存在一个缓冲区。数据在写入文件时,首先会写到这个缓冲区里,如果缓冲区已经满了就会将缓冲区里的数据写入到文件中;或者是达到固定的刷盘时间时,此时无论缓冲区满不满都会写入到文件中

在进行消息的存储时,RabbitMQ 会在 ETS(Erlang Term Storage)表中记录消息在文件中的位置映射和文件的相关信息

ETS:Erlang 所独有的,是一个基于内存的 KV( Key Value) Table,支持大数据量存储以及高效查询

5.3 存储机制

Message 可以直接存储在 rabbit_queue_index 中,也可以存储在 rabbit_msg_store 中

一般的处理方式是:将较小的消息存在 rabbit_queue_index 中,而较大的消息存在 rabbit_msg_store 中

读取 Message 时,先根据 Message 的编号找到对应存储的文件
如果文件存在并且未被锁住,则直接打开文件,从指定位置读取消息内容
如果文件不存在或者被锁住了,则发送请求由 rabbit_msg_store 进行处理

6. 消费数据

有两种消费方式:推模式拉模式

6.1 推模式

此时 Channel 被设置成投递模式
只要 Consumer 订阅了 Queue,当 Message 到达 RabbitMQ 时,RabbitMQ 会自动且不断的投递 Message 给匹配的 Consumer,而不需要 Consumer 手动来拉取

在该模式下,Message 会提前推送给 Consumer,那么此时就会出现 Consumer 来不及消费的情况;所以在 Consumer 里,设有一个缓冲区,来不及消费的 Message 会暂时存储在缓存区里

使用该模式,优点是 Message 可以及时的被消费,因为此时内存里存在较多的 Message,而不用去文件里,以 IO 的方式读取;缺点就是缓冲区可能会溢出

6.2 拉模式

Consumer 在需要时才会去 Queue 中拉取

在该模式下,实时性较差;且因为是在需要时才会重新建立连接进行拉取,会增加网络上的开销

7. 删除数据

只是从 ETS 表删除指定消息的相关信息,同时更新消息对应的存储文件和相关信息

并不会立即对文件中的消息进行删除,仅仅是标记为垃圾数据而已
有点像项目中的软删除

进行删除操作的前提是:一个文件中的数据全部都是垃圾数据;当满足这个前提之后,会将这个文件一次性全部删除

在 RabbitMQ 中设有检测机制:当检测到逻辑上相邻的两个文件中,所有的垃圾数据大小和所有文件的数据大小的比值超过设置的阈值时,才会触发垃圾回收
合并逻辑:

  1. 锁住这两个文件,禁止读取
  2. 按逻辑的顺序,先整理逻辑排在前面的文件,再整理后面的文件
  3. 将后面文件的数据追加到前面的文件中
  4. 更新 ETS
  5. 删除后面的文件

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

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

相关文章

第十四届模拟赛第二期试题【Java解析】

目录 ✏️写在前面 ✨历史回顾 🎈第一题(二进制API) 代码: 思路: 🎈第二题(闰年问题/时间API) 代码1: 思路1: 代码2: 思路2&#xff1a…

【计算机网络】数据链路层:使用点对点信道的数据链路层

数据链路层信道类型: (1)点对点信道:使用一对一的点对点通信方式 (2)广播信道:使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调主机数据发送。 链路:从一个节点到相邻节点的一…

TCP的三次握手和四次挥手

目录:smile_cat:基础知识回顾1、运输层概述2、端口号3、复用与分用:smiley_cat:重点知识来袭1、TCP和UDP2、三次握手3、四次挥手4、TCP报文段首部格式文章参考来源: TCP的三次握手和挥手–飞天小牛肉20-1-tcp连接——初始化序列号(ISN)_网络安全-CSDN博客_初始序列…

掌握分布式环境缓存更新策略,提高缓存与数据库数据一致性

概述 随着时代的发展,服务系统架构也已经由最初的单体架构转变为分布式、微服务架构模式。 从数据体量上来看,各系统存储的数据量越来越大,数据的查询性能越来越低。 此时,就需要我们不断的进行优化,最常用的就是引入…

NVIDIA RTX3090上安装tensorflow-gpu 1.12.0

目录 项目场景: 问题描述1 CUDA版本不匹配,需要重新安装 解决方案1: 额外安装其他版本的CUDA,并实现版本自由切换。 问题描述2: 1. cuDNN包解压后的cudnn.h文件无法复制到目标文件夹中 2. 如何查看是否会到最初…

计算机系统基础期末复习

C语言代码如下&#xff1a; void fun(int n){ int x n*12;int y n/32; }请将其中计算的部分优化为位运算、移位运算和加法运算的结合。 x n8n4 (n<<3)(n<<2) x (n(n>>31) & 0x1F)>>5 设32位的位串为x(x类型为unsigned int)&#xff0c;现要…

python dingding --- 钉钉机器人API

dingding — 钉钉机器人 github 源码地址&#xff1a;https://github.com/zly717216/dingding 一、模块介绍 版本号 dingding: V1.0.0 功能 当前版本支持群机器人相关API调用&#xff0c;包括发送文本消息、文本链接、markdown、整体跳转 ActionCard、独立跳转 ActionCar…

【MindSpore】DCGAN生成漫画头像-----利用华为云modelarts云终端实现

前言 本人对于 mindspore 一点也不熟悉 但是 对于 学习新事物的心情和动力 一直都很澎湃 本次参加 mindSpore 的 DCGAN生成漫画头像 社区活动&#xff0c;希望能够增长见识 关注 证明图 使用工具 我直接使用的 mindSpore 提供的在线云环境 的终端来 体验 这一次的任务训练 …

【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置

【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置 Autopsy是一款免费开源的优秀数字取证&#xff08;Digital Forensics&#xff09;软件&#xff0c;提供与其他数字取证工具相同的核心功能&#xff0c;并提供其他商业工具不提供的其他基本功能&#xff0c;例如…

video元素与audio元素详解

1.video/audio属性 video元素和audio元素是HTML5中针对视频新增的两个标签&#xff0c;通过对这两个标签进行设置&#xff0c;可以控制页面的 上的音视频的播放。 1.src 属性 设置音/视频文件的URL地址。相关使用代码如下: <video src"movie.mp4"></vide…

【面试】揭秘面试背后的那点真实

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录前言/背景面试流程资料总结/刷题指南个人经验总结寄语&#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢&#xff1a;木芯工作室 、Ivan from Russia 金…

【Windows编程】windows窗口创建过程详解

文章目录前言1 应用程序的分类2 应用程序分类的对比3 编译工具4 windows库文件和头文件5 WinMain函数和MessageBox函数初始6 窗口类7 窗口类的分类8 注册窗口类函数9 注册窗口类的结构体10 注册全局和局部窗口类11 创建窗口的函数12 创建一个windows的过程步骤13 创建一个子窗口…

C语言文件操作——打开 关闭 顺序读写 随机读写

1.文件的打开和关闭 1.1 文件指针 在打开一个文件的时候&#xff0c;会创建一个文件信息区&#xff0c;而文件指针指向的内容就是文件信息区。 文件信息区中存储的到底是什么内容的&#xff0c;我们可以在VS2013中查看一下文件信息区的内容(不同编译器下有所差异)。 struct …

shell脚本的条件判断2:文件属性的判断与比较

一 文件属性的判断与比较 Shell支持大量对文件属性的判断&#xff0c;常用的文件属性操作符很多&#xff0c;如下表所示。更多文件属性操作符可以参考命令帮助手册&#xff08;man test&#xff09;。 二 实例 实例&#xff1a;文件和目录判断 可以创建新的文件&#xff0c;…

属性值最大长度为30个字符(15个汉字)

上图是一位做成人用品店主反馈的问题&#xff0c;查看发过来的错误列表后&#xff0c;发现这份错误列表主要是有两个问题&#xff1a;一、属性值最大长度为30个字符(15个汉字)&#xff1b;二、手机端宝贝描述中每张图片的宽要在480到1500之间&#xff0c;最大高度为2500, 以下图…

深度学习之路=====11=====>>ShuffleNet(tensorflow2)

简介 来源&#xff1a;CVPR2017 作者&#xff1a;张祥雨&#xff0c;西安交通大学本硕博&#xff0c;原微软亚洲研究院研究员 特点 逐点分组卷积&#xff08;pointwise group conv)&#xff1a;使用了kernel_size1的分组卷积&#xff0c;大大降低模型参数量和计算量深度卷积…

阅读书《电子电路原理》截取的一些最核心的思想,找了个课程上海交通大学 郑益慧主讲做辅助(保证基本的理解是对的)。电路要以基本特性为基础从设计角度理解

一、戴维南 和 诺顿 物理量 过程戴维南等效诺顿等效步骤 l将负载电阻开路将负载电阻短路步骤 2计算或测量开路电 压&#xff0c; 即戴维南电压计算或测量短路电流&#xff0c;即诺顿电流步骤 3将电压源短路&#xff0c;电流源开路将电压源短路&#xff0c;电流源开路&#xff…

学生网页课程设计期末作业 HTML+CSS+JavaScript甜品蛋糕网页设计(5页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

如何使用 Nginx 部署 React App 到 linux server

油鹳视频&#xff1a;How To Deploy A React App - Using NGINX & Linux https://www.youtube.com/watch?vKFwFDZpEzXY&t547s 1. 获得一个 linux server 方法很多种&#xff0c;例如 aws EC2 , 阿里云 ECS &#xff0c; linode 等 2. 登录远程服务器并设置服务器 命…

二十八、CANdelaStudio实践-10服务(SessionControl)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍10服务(DiagnosticSessionControl)的查看与编辑,欢迎…