RabbitMQ基础概念-02

RabbitMQ是基于AMQP协议开发的一个MQ产品, 首先我们以Web管理页面为 入口,来了解下RabbitMQ的一些基础概念,这样我们后续才好针对这些基础概念 进行编程实战。
可以参照下图来理解RabbitMQ当中的基础概念:
虚拟主机 virtual host
这个在之前搭建时已经体验过了。RabbitMQ出于服务器复用的想法,可以在一 个RabbitMQ集群中划分出多个虚拟主机,每一个虚拟主机都有AMQP的全套基础 组件,并且可以针对每个虚拟主机进行权限以及数据分配,并且不同虚拟主机之间 是完全隔离的
连接 Connection
客户端与RabbitMQ进行交互,首先就需要建立一个TPC连接,这个连接就是 Connection。
信道 Channel
一旦客户端与RabbitMQ建立了连接,就会分配一个AMQP信道 Channel。每个 信道都会被分配一个唯一的ID。也可以理解为是客户端与RabbitMQ实际进行数据 交互的通道,我们后续的大多数的数据操作都是在信道 Channel 这个层面展开的。 RabbitMQ为了减少性能开销,也会在一个Connection中建立多个Channel,这 样便于客户端进行多线程连接,这些连接会复用同一个Connection的TCP通道,所 以在实际业务中,对于Connection和Channel的分配也需要根据实际情况进行考 量
交换机 Exchange
这是RabbitMQ中进行数据路由的重要组件。消息发送到RabbitMQ中后,会首 先进入一个交换机,然后由交换机负责将数据转发到不同的队列中。RabbitMQ中 有多种不同类型的交换机来支持不同的路由策略。从Web管理界面就能看到,在每 个虚拟主机中,RabbitMQ都会默认创建几个不同类型的交换机来
交换机多用来与生产者打交道。生产者发送的消息通过Exchange交换机分配到各 个不同的Queue队列上,而对于消息消费者来说,通常只需要关注自己感兴趣的队 列就可以了
队列 Queue
队列是实际保存数据的最小单位。队列结构天生就具有FIFO的顺序,消息最终都 会被分发到不同的队列当中,然后才被消费者进行消费处理。这也是最近 RabbitMQ功能变动最大的地方。最为常用的是经典队列Classic。RabbitMQ 3.8.X 版本添加了Quorum队列,3.9.X又添加了Stream队列。
Classic 经典队列
这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠 性。
在这个图中可以看到,经典队列可以选择是否持久化( Durability )以及是否自动 删除(Auto delete )两个属性。 其中,Durability有两个选项,Durable和Transient。 Durable表示队列会将消息 保存到硬盘,这样消息的安全性更高。但是同时,由于需要有更多的IO操作,所以 生产和消费消息的性能,相比Transient会比较低。 Auto delete属性如果选择为是,那队列将在至少一个消费者已经连接,然后所有的 消费者都断开连接后删除自己。 后面的Arguments部分,还有非常多的参数,可以点击后面的问号逐步了解。
Quorum 仲裁队列
仲裁队列,是RabbitMQ从3.8.0版本,引入的一个新的队列类型,整个3.8.X版 本,也都是在围绕仲裁队列进行完善和优化。仲裁队列相比Classic经典队列,在分 布式环境下对消息的可靠性保障更高。官方文档中表示,未来会使用Quorum仲裁 队列代替传统Classic队列。
Quorum是基于Raft一致性协议实现的一种新型的分布式消息队列,他实现了持 久化,多备份的FIFO队列,主要就是针对RabbitMQ的镜像模式设计的。简单理解 就是quorum队列中的消息需要有集群中多半节点同意确认后,才会写入到队列 中。这种队列类似于RocketMQ当中的DLedger集群。这种方式可以保证消息在集 群内部不会丢失。同时,Quorum是以牺牲很多高级队列特性为代价,来进一步保 证消息在分布式环境下的高可靠。 从整体功能上来说,Quorum队列是在Classic经典队列的基础上做减法,因此对 于RabbitMQ的长期使用者而言,其实是会影响使用体验的。他与普通队列的区 别
从官方这个比较图就能看到,Quorum队列大部分功能都是在Classic队列基础上 做减法,比如Non-durable queues表示是非持久化的内存队列。Exclusivity表示独 占队列,即表示队列只能由声明该队列的Connection连接来进行使用,包括队列创 建、删除、收发消息等,并且独占队列会在声明该队列的Connection断开后自动删 除。
其中有个特例就是这个Poison Message(有毒的消息)。所谓毒消息是指消息一直 不能被消费者正常消费(可能是由于消费者失败或者消费逻辑有问题等),就会导致消 息不断的重新入队,这样这些消息就成为了毒消息。这些读消息应该有保障机制进 行标记并及时删除。Quorum队列会持续跟踪消息的失败投递尝试次数,并记录 在"x-delivery-count"这样一个头部参数中。然后,就可以通过设置 Delivery limit 参数来定制一个毒消息的删除策略。当消息的重复投递次数超过了Delivery limit参
数阈值时,RabbitMQ就会删除这些毒消息。当然,如果配置了死信队列的话,就 会进入对应的死信队列。、
Quorum队列更适合于 队列长期存在,并且对容错、数据安全方面的要求比低延
迟、不持久等高级队列更能要求更严格的场景。 例如 电商系统的订单,引入MQ 后,处理速度可以慢一点,但是订单不能丢失。 也对应以下一些不适合使用的场景:
1、一些临时使用的队列:比如transient临时队列,exclusive独占队列,或者经常 会修改和删除的队列。
2、对消息低延迟要求高: 一致性算法会影响消息的延迟。
3、对数据安全性要求不高:Quorum队列需要消费者手动通知或者生产者手动确
认。
4、队列消息积压严重 : 如果队列中的消息很大,或者积压的消息很多,就不要使 用Quorum队列。Quorum队列当前会将所有消息始终保存在内存中,直到达到内 存使用极限。
Stream队列
Stream队列是RabbitMQ自3.9.0版本开始引入的一种新的数据队列类型,也是目 前官方最为推荐的队列类型。这种队列类型的消息是持久化到磁盘并且具备分布式 备份的,更适合于消费者多,读消息非常频繁的场景。
Stream队列的核心是以append-only只添加的日志来记录消息,整体来说,就是 消息将以append-only的方式持久化到日志文件中,然后通过调整每个消费者的消 费进度offset,来实现消息的多次分发。下方有几个属性也都是来定义日志文件的大 小以及保存时间。如果你熟悉Kafka或者RocketMQ,会对这种日志记录消息的方式 非常熟悉。这种队列提供了RabbitMQ已有的其他队列类型不太好实现的四个特 点:
1、large fan-outs 大规模分发
当想要向多个订阅者发送相同的消息时,以往的队列类型必须为每个消费者绑定 一个专用的队列。如果消费者的数量很大,这就会导致性能低下。而Stream队列允 许任意数量的消费者使用同一个队列的消息,从而消除绑定多个队列的需求。
2、Replay/Time-travelling 消息回溯
RabbitMQ已有的这些队列类型,在消费者处理完消息后,消息都会从队列中删 除,因此,无法重新读取已经消费过的消息。而Stream队列允许用户在日志的任何 一个连接点开始重新读取数据。
3、Throughput Performance 高吞吐性能
Strem队列的设计以性能为主要目标,对消息传递吞吐量的提升非常明显。
4、Large logs 大日志
RabbitMQ一直以来有一个让人诟病的地方,就是当队列中积累的消息过多时, 性能下降会非常明显。但是Stream队列的设计目标就是以最小的内存开销高效地存 储大量的数据。整体上来说,RabbitMQ的Stream队列,其实有很多地方借鉴了其他MQ产品的 优点,在保证消息可靠性的基础上,着力提高队列的消息吞吐量以及消息转发性 能。因此,Stream也是在视图解决一个RabbitMQ一直以来,让人诟病的缺点,就 是当队列中积累的消息过多时,性能下降会非常明显的问题。RabbitMQ以往更专 注于企业级的内部使用,但是从这些队列功能可以看到,Rabbitmq也在向更复杂的 互联网环境靠拢,未来对于RabbitMQ的了解,也需要随着版本推进,不断更新。 但是,从整体功能上来讲,队列只不过是一个实现FIFO的数据结构而已,这种数 据结构其实是越简单越好。而当前RabbitMQ区分出这么多种队列类型,其实极大 的增加了应用层面的使用难度,应用层面必须有一些不同的机制兼容各种队列。所 以,在未来版本中,RabbitMQ很可能还是会将这几种队列类型最终统一成一种类 型。例如官方已经说明未来会使用Quorum队列类型替代经典队列,到那时,应用 层很多工具就可以得到简化,比如不需要再设置durable和exclusive属性。虽然 Quorum队列和Stream队列目前还没有合并的打算,但是在应用层面来看,他们两 者是冲突的,是一种竞争关系,未来也很有可能最终统一保留成一种类型。至于未 来走向如何,我们可以在后续版本拭目以待

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

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

相关文章

【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

文章目录 一、构造函数意义1、类的构造函数2、构造函数显式调用与隐式调用3、构造函数替代方案 - 初始化函数4、初始化函数缺陷5、默认构造函数6、代码示例 - 初始化函数无法及时调用 一、构造函数意义 1、类的构造函数 C 提供的 构造函数 和 析构函数 作为 类实例对象的 初始化…

正则表达式使用总结

一、字符匹配 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。 元字符:元字符具有特殊的含义,例如 \d 匹配任意数字字符,\w 匹配任意字母数字字符&#xf…

【遥感变化检测综述】—《多时相遥感影像的变化检测研究现状与展望》

作者:张 祖 勋,姜 慧 伟,庞 世 燕,胡 翔 云 论文连接:多时相遥感影像的变化检测研究现状与展望 — 张祖勋 1、内容概述 本文主要从几何和语义两个角度对变化检测方法进行了分析和归纳总结,重点分析了几何信…

SQL5 将查询后的列重新命名

描述 题目:现在你需要查看前2个用户明细设备ID数据,并将列名改为 user_infos_example,,请你从用户信息表取出相应结果。 示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学…

Debian离线安装mysql

PS:虽然已经分享了很多安装各种环境订的教程,但是每个客户的环境不一样,那就得重新来一次,其实都是大同小异的,但是里面其实也是存在不少坑的,今天我们就来安装一个新的东西,Debian 11离线安装mysql,为什么…

无涯教程-JavaScript - RATE函数

描述 RATE函数返回年金每个周期的利率。 RATE通过迭代计算得出,可以有零个或多个解。如果RATE的连续输出在20次迭代后未收敛到0.0000001以内,则RATE返回#NUM!错误值。 语法 RATE (nper, pmt, pv, [fv], [type], [guess])有关参数nper,pmt,pv,fv和type的完整说明,请参见PV Fu…

SpringMvc增删改查

SpringMvc增删改查 一、前期准备二、逆向生成增删改查2.2.aspect切面层2.3.Mybatis generator逆向生成2.4.根据生成代码编写Biz层与实现类 三、controller层代码编写四、前台代码与分页代码五、案例测试 一、前期准备 1.2.导入pom.xml依赖 <?xml version"1.0" …

基于springboot的新闻门户网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

接口测试 —— Requests库GET请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 &#xff08;不带参数的GET请求请看上一篇文章的练习&#xff09; 1、Requests库待参数的GET请求 使用Get方法带参数请求时&#xff0c;是params参数字典&#xff0c;而不是data参数字典。data参数字典…

基本Dos命令

1.打开cmd的方式 &#xff08;1&#xff09;winR&#xff0c;输入cmd即可 &#xff08;2&#xff09;在任意文件夹下面&#xff0c;按住shift键后点击鼠标右键&#xff0c;即可在此文件夹目录下打开命令行窗口。 &#xff08;3&#xff09;资源管理器的地址栏前面加上 cmd…

uni-app直播从0到1实战

1.安装开发工具 2.创建项目 参考&#xff1a;uniapp从零到一的学习商城实战_云澜哥哥的博客-CSDN博客 3.编写公共样式&#xff1a;common.css & free.css App.vue引入公共文件&#xff1a; 图标库&#xff1a;iconfont-阿里巴巴矢量图标库

MapTR v2文章研读

MapTR v2论文来了&#xff0c;本文仅介绍v2相较于v1有什么改进之处&#xff0c;如果想了解v1版本的论文细节&#xff0c;可见链接。 相较于maptr&#xff0c;maptr v2改进之处&#xff1a; 在分层query机制中引进解耦自注意力机制&#xff0c;有效降低了内存消耗&#xff1b;…

Jenkins 页面部分显示Http状态403 被禁止

前言 生产环境Jenkins部署了一段时间了&#xff0c;结果今天在流水线配置中&#xff0c;部分页面显示Jenkins 页面部分显示Http状态403 被禁止&#xff0c;修改配置点击保存之后偶尔也会出现这个。 问题 以下是问题图片 解决 在全局安全配置里面&#xff0c;勾选上启用代…

电脑磁盘分区形式是什么?如何更改?

磁盘分区形式介绍 在了解为什么以及如何更改分区形式之前&#xff0c;让我们对磁盘分区形式有一个基本的了解。一般来说&#xff0c;分区形式是指主引导记录&#xff08;MBR&#xff09;和 GUID 分区表&#xff08;GPT&#xff09;。 MBR和GPT是Windows系统中常用…

从构建者到设计者的低代码之路

低代码开发技术&#xff0c;是指无需编码或通过少量代码就可以快速生成应用程序的工具&#xff0c;一方面可降低企业应用开发人力成本和对专业软件人才的需求&#xff0c;另一方面可将原有数月甚至数年的开发时间成倍缩短&#xff0c;帮助企业实现降本增效、灵活迭代。那么&…

MySQL 8.0 驱动与阿里druid版本兼容操作

注意&#xff1a;这个异常表面druid数据源的版本与MySql 8.0的驱动版本不匹配&#xff0c;解决方法如下&#xff1a; 确保MySql 8.0的驱动如下网址&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifact…

Linux——环境变量

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——环境变量 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作…

嵌入式学习之链表

对于链表&#xff0c;要重点掌握链表和数组区别和实现&#xff0c;链表静态添加和动态遍历&#xff0c;链表中pointpoint-next,链表节点个数的查找&#xff0c;以及链表从指定节点后方插入新节点的知识。

服务器巡检表-监控指标

1、巡检指标 系统资源K8S集群NginxJAVA应用RabbitMQRedisPostgreSQLElasticsearchELK日志系统 2、巡检项 检查项目 检查指标 检查标准 系统资源 CPU 使用率 正常&#xff1a;&#xff1c;70% 低风险&#xff1a;≥ 70% 中风险&#xff1a;≥ 85% 高风险&#xff1a;≥ 9…

图片怎么压缩大小?这样压缩图片很简单

在日常生活中&#xff0c;我们常常需要处理各种各样的图片文件&#xff0c;但有时候图片的大小可能会成为问题。比如在上传图片到网站或者将图片发送给朋友时&#xff0c;过大的图片可能会导致上传速度变慢或者占用过多内存。这时&#xff0c;我们就需要用到图片压缩了&#xf…