当前位置: 首页 > news >正文

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队列目前还没有合并的打算,但是在应用层面来看,他们两 者是冲突的,是一种竞争关系,未来也很有可能最终统一保留成一种类型。至于未 来走向如何,我们可以在后续版本拭目以待

相关文章:

RabbitMQ基础概念-02

RabbitMQ是基于AMQP协议开发的一个MQ产品, 首先我们以Web管理页面为 入口,来了解下RabbitMQ的一些基础概念,这样我们后续才好针对这些基础概念 进行编程实战。 可以参照下图来理解RabbitMQ当中的基础概念: 虚拟主机 virtual hos…...

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

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

Linux创建进程 及父子进程虚拟空间 多进程GDB调试

父子进程的资源是读时共享,写时拷贝,用到某一个资源,比如说改变变量的值的时候才去拷贝这个变量到一个独立的空间 父子进程的关系: 区别: 1.fork()函数的返回值不同 父进程中:>…...

uni-app 之 表格设置

uni-app 之 表格设置 image.png <view style"padding: 3%; border: #1296db;"><table style"width: 100%; border-collapse: collapse; "><tr style"height: 50px;border: 2px solid;border-color: #F7F7F7;"><td style&qu…...

Linux易混淆知识点

1. 使用 vi 编辑某个文件时&#xff0c;执行删除某行/某几行的操作&#xff1a; dd&#xff1a;删除光标所在行&#xff1b; 6dd&#xff1a;表示删除当前行开始 6 行数据。 ndd&#xff1a; 删除当前行开始的连续 n 行&#xff1b; n1,n2d&#xff1a;删除 n1 到 n2 行&#x…...

移植FlashDB、SFUD到STM32f407

个人上篇文章 搭建STM32F407的SPI-Flash&#xff08;基于STM32CubeMX&#xff09;_小刚学長的博客-CSDN博客 主要是解决STM32CubeMX这边的配置&#xff0c;对code端侧是简单介绍了下 实际项目上一般都是拿片外flash存储一些东西&#xff0c;比如一些比较多的配置、参数&…...

【算法基础】时间复杂度和空间复杂度

目录 1 算法的评价 2 算法复杂度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.1.1 如何计算时间复杂度&#xff1a; 2.1.2 常见的时间复杂度类别与示例 2.2 空间复杂度 2.2.1 如何计算空间复杂度 2.2.2 常见的空间复杂度与示例 3 时间复杂度和空间复杂度…...

解决微信小程序不支持TextEncoder/TextDecoder对象

问题描述&#xff1a;在使用小程序开发者工具开发小程序中使用到了CRC算法&#xff0c;其中有一行代码使用到了TextEncoder对象&#xff0c;在开发工具中一切正常&#xff0c;到手机上会报出错误错误如下&#xff1a; MiniProgramError TextEncoder is not defined ReferenceEr…...

Qt下SVG格式图片应用

SVG格式图片介绍 svg格式图片又称矢量图&#xff0c;该种格式的图片不同于png等格式的图片&#xff0c;采用的并不是位图的形式来组织图片&#xff0c;而是采用线条等组织图片&#xff0c;svg格式是图片的文件格式是xml&#xff0c;可以通过文件编译器打开查看svg格式内容。 …...

python异常处理

参考语法&#xff1a;https://docs.python.org/zh-cn/3/tutorial/errors.html 在编写代码的时候&#xff0c;如果你写的程序出现报错&#xff0c;程序就会停止运行&#xff0c;后面的代码就不再执行。 如果程序发生错误&#xff0c;可以在代码中添加异常处理&#xff0c;保证程…...

go get命令不再具有安装功能

go get功能呢 一直以来&#xff0c;我们知道go get命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包&#xff0c;并自动完成编译和安装。整个过程就像安装一个App一样简单。 go get命令可以动态获取远程代码包&#xff0c;命令在内部实际上分成了两步操作&#x…...

合宙Air724UG LuatOS-Air lvgl7-lvgl(矢量字体)

如何用开发板实现lvgl加载外部矢量字体功能 目录名称 如何用开发板实现lvgl加载外部矢量字体功能 简介材料准备API 说明步骤 1. 将字库芯片接在模块spi上2. 版本定制3. 初始化spi4. 设置字体5.字体使用测试固件和脚本显示效果字号灰度最佳粗细值对应表常见问题 1. 设置68号字体…...

LRU的实现

题目内容 实现一个 LRUCache 类&#xff0c;三个接口&#xff1a; LRUCache(int capacity) 创建一个大小为 capacity 的缓存get(int key) 从缓存中获取键为 key 的键值对的 valueput(int key, int value) 向缓存中添加键值对 (key, value) 要求 get 和 put 的均摊时间复杂度…...

consul 备份还原导入导出

正文 工作中要保证生产环境部署的consul的集群能够安全稳定地对外提供服务&#xff0c;即使出现系统故障也能快速恢复&#xff0c;这里将讲述部分的备份还原操作及KV的导入导出操作。 备份与还原 配置文件、服务器状态 需要备份的主要有两类数据&#xff1a;consul相关的配置文…...

6.网络编程套接字(下)

文章目录 4.TCP流套接字编程4.1ServerSocket API4.2Socket API4.3TCP中的长短连接4.4示例一&#xff1a;一发一收&#xff08;长连接&#xff09;4.4.1TCP服务端4.4.2TCP客户端 4.5示例二&#xff1a;请求响应&#xff08;短连接&#xff09;4.5.1TCP服务端4.5.2TCP客户端 4.6再…...

4.3-内置后置PostProcess处理器深度讲解

在reader里面注册了很多Bean定义 reader会调取register()来注册配置类 调用上句&#xff0c;就会把配置类注册到BeanDefinitionMap中去 配置类有了、解析配置类的处理器有了 然后&#xff0c; 在第三步refresh() 进行IOC容器刷新中的invokeBeanPostProcessors(beanFactory…...

LeetCode(力扣)45. 跳跃游戏 IIPython

LeetCode45. 跳跃游戏 II 题目链接代码 题目链接 https://leetcode.cn/problems/jump-game-ii/description/ 代码 class Solution:def jump(self, nums: List[int]) -> int:if len(nums) 1:return 0curdis 0nextdis 0step 0for i in range(len(nums)):nextdis max(…...

mysql5.8 免安装版(压缩包)win10 安装

目录 1、下载MySQL5.82、如何安装、配置my.ini配置注意 3初始化mysql3.1. 初始化mysql3.2. 安装mysql服务3.3. 启动mysql3.4. 登录mysql3.5. 修改root密码3.6. 配置远程连接 Mysql5.8安装踩坑记录&#xff0c;推荐使用Docker安装&#xff0c;我是电脑虚拟化可能会蓝屏没用这个功…...

STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器

STM32-HAL库06-IIC驱动FM24CL16B非易失存储器 一、所用材料&#xff1a; STM32VGT6自制控制板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 二、所学内容&#xff1a; 通过HAL库的硬件IIC对FM24CL16B存储器进行写与读取操作。 三、CUBEMX配置&#xff1a; 第一步…...

python-wordcloud词云

导入模块 from wordcloud import WordCloud import jieba import imageio import matplotlib.pyplot as plt from PIL import ImageGrab import numpy as npwordcloud以空格为分隔符号&#xff0c;来将文本分隔成单词 PIL pillow模块 img imageio.imread(image.png)这行代码…...

单元测试与自测

单元测试在百度百科的定义&#xff1a; 自测在百度百科的定义&#xff1a; 单元测试是测一个类或一个函数&#xff0c;自立门第main函数&#xff0c;不依赖于项目&#xff0c;预期的是这个类或函数是没有问题的。程序编码完成之后至各种测试再到用户使用出现的任何bug都是单元测…...

2023-09-12 LeetCode每日一题(课程表 IV)

2023-03-29每日一题 一、题目编号 1462. 课程表 IV二、题目链接 点击跳转到题目位置 三、题目描述 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你…...

RabbitMQ基础

目录 MQ MQ概述 MQ 的优势 1.应用解耦 2.异步提速 3.削峰填谷 MQ 的劣势 1.系统可用性降低 2.系统复杂度提高 3.一致性问题 使用 MQ 需要满足什么条件呢&#xff1f; RabbitMQ 简介 ​编辑RabbitMQ 中的相关概念 RabbitMQ 提供了 6 种工作模式 JMS java实现Ra…...

ITIL 4—创建、交付和支持—创建、交付和支持服务的价值流

4. 创建、交付和支持服务的价值流 本章节提供了有关如何&#xff1a; 记录一个价值流以理解工作流程如何贯穿该组织了解创建一个新服务的原型价值流了解支持一个现场服务的原型价值流 本章将帮助从业者理解&#xff1a; 价值流在 服务价值系统(SVS) 中的作用价值流的分类如…...

微信怎么给自己发消息

前段时间看到一份数据调查&#xff0c;说是到目前为止&#xff0c;全球使用微信的用户已达到10亿多人次&#xff0c;天啊&#xff0c;多么强大的用户群体&#xff01; 这么多人喜欢使用微信&#xff0c;相信大家都知道&#xff0c;微信里面有一个特俗功能&#xff0c;可以自己…...

正交试验设计法

正交实验设计 一、什么是正交试验设计法&#xff1f; 是一种成对测试交互的系统的统计方法。它提供了一种能对所有变量对的组合进行典型覆盖&#xff08;均匀分布&#xff09;的方法。 可以从大量的试验点中挑出适量的、有代表性的点&#xff0c;利用“正交表”&#xff0c;…...

Scrum工具:助力快速迭代和高效交付

​随着软件开发行业的不断发展&#xff0c;敏捷开发方法逐渐成为了主流。Scrum作为敏捷开发中最具代表性的工具之一&#xff0c;其在流程设计、团队协作以及项目管理等方面发挥着重要作用。本文将深入探讨Scrum的优势以及如何运用Scrum提升团队效率与质量。 一、Scrum敏捷开发工…...

通过Python行命令搭建HTTP服务器结合内网穿透实现外网访问

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 Python作为热度比较高的编程语言&#xff0c;其语法简单且语句清晰&#xff0c;而且python有…...

Android T 窗口层级其三 —— 层级结构树添加窗口

文章目录 序节点添加Task以DefaultTaskDisplayArea为父节点以Task为父节点 ActivityRecordWindowTokenWindowState以WindowToken为父节点以ActivityRecord为父节点 小结调用场景添加差异 流程分析添加log堆栈打印流程LauncherStatusBar 序 尚未添加窗口的层级结构树&#xff0…...

3D虚拟数字人定制,推动传统文化传播新高度

“数字人”成为“汉语盘点2022”年度十大新词语。伴随着科技发展成长的年轻人逐渐成为消费主力军&#xff0c;如何在虚拟世界与年轻一代用户互动以抓住95后年轻人受众&#xff0c;成为不少传统文化品牌发力的重点。 数字人“天妤”&#xff0c;在3D虚拟数字人定制中&#xff0…...

服装网站模块方案/广州seo优化公司

随便指定一个目录&#xff0c;判断它是否是一个合法的JDK目录(by quqi99) 作者&#xff1a;张华 发表于&#xff1a;2006-11-01 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。 http://blog.csdn.net/quqi99…...

部队网站怎么做/互联网营销师培训大纲

概要 python简历 Python[1] &#xff08;英国发音&#xff1a;/ˈpaɪθən/ 美国发音&#xff1a;/ˈpaɪθɑːn/&#xff09;, 是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&#xff0c;第一个公开发行版发行于1991年。 Pyth…...

鸡西市网站建设/源云推广

目录一. 复习事物隔离级别事物隔离级别中可能涉及到的几个问题版本链二. MVCC什么是当前读,快照读什么是ReadView不同隔离解绑下 ReadView 的生成规则MVCC下可见性判断流程1. 读取已提交隔离级别下执行示例2. 可重复读隔离级别下执行示例如何解决幻读为什么可重复读隔离级别下是…...

怎样在手机上创建网站/太原网站开发

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid1018 题目大意&#xff1a; 求n阶乘的位数思路&#xff1a; N的阶乖的位数等于LOG10&#xff08;N&#xff01;&#xff09;&#xff1d;LOG10&#xff08;1&#xff09;&#xff0b;.....LOG10&#xff08;N&…...

网站开发实习生/自动点击器软件

root为#&#xff0c;普通用户用$常用指令ls   显示文件或目录-l 列出文件详细信息l(list)---ls -l-a 列出当前目录下所有文件及目录&#xff0c;包括隐藏的a(all)mkdir 创建目录-p 创建目录&#xff0c;若无父目录&#xff0c…...

怎么创建网站平台赚钱/网络营销专业是做什么的

目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 3、递归练习 一、方法的概念及使用 1、…...