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

【RabbitMQ】初识 RabbitMQ

初识 RabbitMQ

  • 1.认识 RabbitMQ
    • 1.1 介绍
    • 1. 2.使用场景
      • 1.2.1 推送通知
      • 1.2.2 异步任务
      • 1.2.3 多平台应用的通信
      • 1.2.4 消息延迟
      • 1.2.5 远程过程调用
    • 1.3 特性
  • 2.基本概念
    • 2.1 生产者、消费者和代理
    • 2.2 消息队列
    • 2.3 交换机
      • 2.3.1 direct
      • 2.3.2 topic
      • 2.3.3 headers
      • 2.3.4 fanout
    • 2.4 绑定
    • 2.5 通道
    • 2.6 消息确认

1.认识 RabbitMQ

1.1 介绍

RabbitMQ 是开源的 高级消息队列协议Advanced Message Queueing ProtocolAMQP)的实现,用 Erlang 语言编写,支持多种客户端。

RabbitMQ 是目前应用相当广泛的消息中间件(其他同类的消息处理中间件有 ActiveMQ、Kafka 等)。在企业级应用、微服务应用中,RabbitMQ 担当着十分重要的角色。例如,在业务服务模块中 解耦异步通信高并发限流超时业务数据延迟处理 等都可以使用 RabbitMQ。

在这里插入图片描述

1. 2.使用场景

1.2.1 推送通知

发布 / 订阅 是 RabbitMQ 的重要功能。可以用 “发布 / 订阅” 功能来实现通知功能。消费者(consumer)一直监听 RabbitMQ 的数据。如果 RabbitMQ 有数据,则消费者会按照 先进先出 规则逐条进行消费。而生产者(producer)只需要将数据存入 RabbitMQ。这样既降低了不同系统之间的耦合度,也确保了消息通知的及时性,且不影响系统的性能。

发布 / 订阅” 功能支持三种模式:一对一一对多广播。这三种模式都可以根据规则选择分发的对象。众多消费者可以根据规则选择是否接收这些数据,扩展性非常强。

1.2.2 异步任务

后台系统接到任务后,将其分解成多个小任务,只要分别完成这些小任务,整个任务便可以完成。但是,如果某个小任务很费时,且延迟执行并不影响整个任务,则可以将该任务放入消息队列中去处理,以便加快请求响应时间。

如果用户注册会员时有一项需求:发送验证邮件或短信验证码以完成验证,则可以使用 RabbitMQ 的消息队列来实现,这样可以及时提醒用户操作已经成功。等待收到邮件或验证码,然后进行相应的确认,即完成验证。

1.2.3 多平台应用的通信

RabbitMQ 可以用于不同开发语言开发的应用间的通信(如 Java 开发的应用程序需要与 C++ 开发的应用程序进行通信),实现企业应用集成。由于消息队列是无关平台和语言的,而且语义上也不是函数调用,因此 RabbitMQ 适合作为多个应用之间的松耦合的接口,且不需要发送方和接收方同时在线。

不同语言的软件解耦,可以最大限度地减少程序之间的相互依赖,提高系统可用性及可扩展性同时还增加了消息的可靠传输和事务管理功能。

RabbitMQ 提供两种事务模式:

  • AMQP 事务模式
  • Confirm 事务模式

1.2.4 消息延迟

利用 RabbitMQ 消息队列延迟功能,可以实现订单、支付过期定时取消功能。因为延迟队列存储延时消息,所以,当消息被发送以后,消费者不是立即拿到消息,而是等待指定时间后才拿到这个消息进行消费。

当然,死信、计时器、定时任务也可以实现延迟或定时功能,但是需要开发者去处理。

要实现消息队列延迟功能,一般采用官方提供的插件 rabbitmq_delayed_message_exchange 来实现,但 RabbitMQ 版本必须是 3.5.8 3.5.8 3.5.8 版本以上才支持该插件。如果低于这个版本则可以利用 死信 来完成。

1.2.5 远程过程调用

在实际的应用场景中,有时需要一些同步处理,以等待服务器端将消息处理完成后再进行下步处理,这相当于 RPCRemote Procedure Call远程过程调用)。RabbitMQ 也支持 RPC。

1.3 特性

RabbitMQ 具有以下特性。

  • 信息确认:RabbitMQ 有以下两种应答模式。
    • 自动应答:当 RabbitMQ 把消息发送到接收端,接收端从队列接收消息时,会自动发送应答消息给服务器端。
    • 手动应答:需要开发人员手动调用方法告诉服务器端已经收到。

如果实际场景中对个别消息的丢失不是很敏感,则选用自动应答比较理想。如果是一个消息都不能丢的场景,则需要选用手动应答,在正确处理完以后才应答。如果选择了自动应答,那消息重发这个功能就没有了。

  • 队列持久化:队列可以被持久化,但是否为持久化,要看持久化设置。
  • 信息持久化:设置 properties.DeliveryMode 值即可。默认值为 1 1 1,代表不是持久的, 2 2 2 代表持久化。
  • 消息拒收:接收端可以拒收消息,而且在发送 reject 命令时,可以选择是否要把拒收的消息重新放回队列中。
  • 消息的 QoS:在接收端设置的。发送端没有任何变化,接收端的代码也比较简单,只需要加上如 channel.BasicQos(0,1,false); 的代码即可。

2.基本概念

2.1 生产者、消费者和代理

RabbitMQ 的角色有以下三种。

  • 生产者:消息的创建者,负责创建和推送数据到消息服务器。
  • 消费者:消息的接收方,用于处理数据和确认消息。
  • 代理:RabbitMQ 本身,扮演 “快递” 的角色,本身不生产消息。

🚀 生产者和消费者并不属于 RabbitMQ,RabbitMQ 只是为生产者和消费者提供发送和接收消息的 API。

2.2 消息队列

Queue(队列)是 RabbitMQ 的内部对象,用于存储生产者的消息直到发送给消费者,也是消费者接收消息的地方。RabbitMQ 中的消息也都只能存储在 Queue 中,多个消费者可以订阅同一个Queue。

Queue 有以下一些重要的属性。

  • 持久性:如果启用,则队列将会在 消息协商器broker)重启前都有效。
  • 自动删除:如果启用,则队列将会在所有的消费者停止使用之后自动删除掉。
  • 惰性:如果没有声明队列,则应用程序调用队列时会导致异常,并不会主动声明。
  • 排他性:如果启用,则声明它的消费者才能使用。

2.3 交换机

Exchange(交换机)用于接收、分配消息。生产者先要指定一个 routing key,然后将消息发送到交换机。这个 routing key 需要与 ExchangeTypebinding key 联合使用才能最终生效,然后,交换机将消息路由到一个或多个 Queue 中,或丢弃。

在虚拟主机的消息协商器(broker)中,每个 Exchange 都有唯一的名字。

Exchange 包含 4 4 4 种类型:directtopicfanoutheaders。不同的类型代表绑定到队列的行为不同。

🚀 AMQP 规范里还有两种交换机类型:system自定义

2.3.1 direct

direct 类型的行为是 “先匹配,再投送”。在绑定队列时会设定一个 routing key,只有在消息的 routing key 与队列匹配时,消息才会被交换机投送到绑定的队列中。允许一个队列通过一个固定的 routing key(通常是队列的名字)进行绑定。Direct 交换机将消息根据其 routing key 属性投递到包含对应 key 属性的绑定器上。

Direct Exchange 是 RabbitMQ 默认的交换机模式,也是最简单的模式。它根据 routing key 全文匹配去寻找队列。
在这里插入图片描述

2.3.2 topic

按规则转发消息(最灵活)。主题交换机(topic exchange)转发消息主要根据通配符。队列和交换机的绑定会定义一种路由模式,通配符就要在这种路由模式和路由键之间匹配后,交换机才能转发消息。

在这种交换机模式下,路由键必须是一串字符,用 . 隔开。

路由模式必须包含一个星号 *,主要用于匹配路由键指定位置的一个单词。

topic 还支持消息的 routing key,用 *# 的模式进行绑定。* 匹配一个单词,# 匹配 0 0 0 个或多个单词。例如,binding key *.user.# 匹配 routing keycn.userus.user.db,但是不匹配 user.hello
在这里插入图片描述

2.3.3 headers

它根据应用程序消息的特定属性进行匹配,可以在 binding key 中标记消息为可选或必选。在队列与交换机绑定时,会设定一组键值对规则。消息中也包括一组键值对(headers 属性),当这些键值对中有一对,或全部匹配时,消息被投送到对应队列。
在这里插入图片描述

2.3.4 fanout

消息广播的模式,即将消息广播到所有绑定到它的队列中,而不考虑 routing key 的值(不管路由键或是路由模式)。如果配置了 routing key,则 routing key 依然会被忽略。
在这里插入图片描述

2.4 绑定

RabbitMQ 中通过绑定(binding),将 Exchange 与 Queue 关联起来。这样 RabbitMQ 就知道如何正确地将消息路由到指定的 Queue 了。

在绑定 Exchange 与 Queue 时,一般会指定一个 binding key。消费者将消息发送给 Exchang 时,一般会指定一个 routing key。如果 binding keyrouting key 相匹配,则消息将会被路由对应的 Queue 中。

绑定是生产者和消费者消息传递的连接。生产者发送消息到 Exchange,消费者从 Queue 接收消息,都是根据绑定来执行的。

在这里插入图片描述

2.5 通道

有些应用需要与 AMQP 代理建立多个连接。但同时开启多个 TCP(Transmission Control Protocol,传输控制协议)连接会消耗过多的系统资源,并使得防火墙的配置变得更加困难。AMQP 0-9-1 协议用 通道channel)来处理多连接,可以把通道理解成 共享一个 TCP 连接的多个轻量化连接

在这里插入图片描述
一个特定通道上的通信与其他通道上的通信是完全隔离的,因此,每个 AMQP 方法都需要携带一个通道号。这样客户端就可以指定此方法是为哪个通道准备的。

2.6 消息确认

消息确认message acknowledgement)是指:当一个消息从队列中投递给消费者(consumer)后,消费者会通知一下消息代理(broker),这个过程可以是自动的,也可以由处理消息的应用的开发者执行。当 “消息确认” 启用时,消息代理需要收到来自消费者的确认回执后,才完全将消息从队列中删除。

如果消息无法被成功路由,或被返给发送者并被丢弃,或消息代理执行了延期操作,则消息会被放入一个 死信 队列中。此时,消息发送者可以选择某些参数来处理这些特殊情况。

相关文章:

【RabbitMQ】初识 RabbitMQ

初识 RabbitMQ 1.认识 RabbitMQ1.1 介绍1. 2.使用场景1.2.1 推送通知1.2.2 异步任务1.2.3 多平台应用的通信1.2.4 消息延迟1.2.5 远程过程调用 1.3 特性 2.基本概念2.1 生产者、消费者和代理2.2 消息队列2.3 交换机2.3.1 direct2.3.2 topic2.3.3 headers2.3.4 fanout 2.4 绑定2…...

Qt QListView自定义树状导航控件

大部分的软件都有多个页面,这时候就需要一个导航栏控件,通过在导航栏中选择某一栏,同时显示对应的页面。 本文代码效果如下: 本文的导航栏控件基于大佬 feiyangqingyun 的导航栏控件博客Qt/C编写自定义控件46-树状导航栏_qt之实现…...

Java 数组的全面解析与应用

Java 中的数组是一种基础且重要的数据结构,用于存储相同类型的多个数据项。它提供了有效的数据组织和访问机制,是 Java 编程中不可或缺的部分。本文将从多个角度全面探讨 Java 数组的特性、操作和实际应用,帮助读者深入理解和有效利用这一数据…...

Thinkphp起名网宝宝起名网站源码

Thinkphp起名网宝宝起名网站源码 源码介绍 1.宝宝在线起名 2.八字起名,周易取名 3.一对一起名 5.支持手机wap 链接数据库地址:Application\Common\Conf 修改里面config.php数据库连接,导入sm.sql数据库文件即可 伪静态用thinkphp 后台…...

【解决方案】【最佳实践】React高阶组件中Refs 不会被传递的问题

大家好,我是DX3906。 最近遇到React高阶组件中Refs 不会被传递的问题。 在这里总结一下解决方案和解决思路:主要是通过从内向外和从外向内2种思路来分析解决的。 目录 前言 解决方案一:React.forwardRef 解决方案二:使用prop…...

SRAM和DRAM

1.SRAM(静态RAM) 把存放一个二进制位的物理器件称为存储元,它是存储器最基本的构件。 地址码相同的多个存储元构成一个存储单元。 存储单元的集合构成存储体。 静态RAM的存储元是用双稳态触发器(六晶体管MOS)来记忆…...

浅析Spring中Async注解底层异步线程池原理

一、前言 开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程,然后启动异步线程;再如,可以直接用java.uti…...

sqli-labs 靶场 less-7 第七关详解:OUTFILE注入与配置

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。Less 7 SQLI DUMB SERIES-7判断注入点 进入页面中,并输入数据查看结果。 发现空数据提…...

AIGC新秀亮相,哪款大模型产品最得你心?

AIGC新秀亮相,哪款大模型产品最得你心? 近日,腾讯元宝APP的正式上线,为国内大模型AIGC产品市场增添了一名新成员。 这些所谓的“全能”大模型产品,凭借其强大的生成能力和广泛的应用场景,正逐渐改变我们的…...

RabbitMQ消息的可靠传输和防止消息丢失

在Spring Cloud项目中,为了确保RabbitMQ消息的可靠传输和防止消息丢失,需要考虑以下几个方面: 消息持久化:确保消息在RabbitMQ中持久化。队列持久化:确保队列是持久化的。发布确认:使用发布确认机制确保消…...

.net8系列-图文并茂手把手教你使用Nlog记录.net日志

Nlog是什么? NLog是一个为.NET平台设计的灵活且免费的日志记录库。它适用于包括.NET Framework、.NET Core和.NET Standard在内的多种.NET环境。 Nlog有什么好处或者特点? 配置灵活:NLog允许开发者通过配置文件(通常是NLog.conf…...

课时158:脚本发布_简单脚本_远程执行

2.1.3 远程执行 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 有时候,我们需要通过远程方式到另外一台主机进行脚本的执行 格式:ssh 远程主机登录用户名远程主机ip地址 "执行命令"效果 [r…...

3dmax2025能用云渲染吗?2025最新云渲染渲染100使用方法

3dmax2025还没用上云渲染?简单3步用上云渲染。 第一步,打开浏览器搜索渲染100,并进入下载客户端并安装 第二步,打开已安装的客户端进行安装,点击登录,未登录注册个账号即可(注册账号时邀请码填…...

从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)

搭建开发环境 参考资料 0、基础环境准备0.1、idea0.2、jdk0.3、源码 1、导入工程2、配置启动环境2.1、打开新增配置面板2.2、配置工作目录2.2.1、从常用配置中选择2.2.2、直接粘贴 2.3最终效果 3、调整源码3.1、添加maven引用3.2、注释无效代码3.3、删除测试代码 4、修改运行端…...

分类模型:MATLAB判别分析

1. 判别分析简介 判别分析(Discriminant Analysis) 是一种统计方法,用于在已知分类的样本中构建分类器,并根据特征变量对未知类别的样本进行分类。常见的判别分析方法包括线性判别分析(Linear Discriminant Analysis, …...

生产 的mybatisplus 日志输入到日志文件

默认是输出到控制台.不输出到日志文件 输出到日志文件.需要修改配置 第一步. logging:config: classpath:logback-wshoto.xml第二步 mybatis-plus:configuration:cache-enabled: truedefault-executor-type: reuselog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl第三步…...

八分钟生成一篇两万字的文章演示——《基于灰色预测的人口预测模型》

文章目录 工具使用 《基于灰色预测的人口预测模型》-全文由AI一次性生成文献综述研究方法模型开发灰色预测模型的数学构建参数估计模型验证 案例研究案例研究描述数据收集与预处理灰色预测模型的应用 文献综述研究方法模型开发灰色预测模型的数学构建参数估计模型验证 案例研究…...

golang 透明底图转白底

url : ""var s []byte// 请求线上图片s GetUrl(url)// 处理透明底图转白底img, _, err : image.Decode(bytes.NewReader(s))if err ! nil {fmt.Println("读取图片失败")}bounds : img.Bounds()dst : image.NewNRGBA(bounds)draw.Draw(dst, bounds, image.…...

【一】【网络使用小知识】使用aria2软件结合Windows PowerShell命令行快速下载文件

下载aria2软件 点击进入网址,aria2下载网址. 下载windows版本. 通过Windows PowerShell命令行使用aria2软件下载文件 通用下载文件命令行代码 aria2软件完整路径 -x 16 -s 32 -d 下载目录(文件夹) -o 文件名 下载链接路径示例,用aria2下载qq 找到aria2应用的直接地址,结合…...

报错:C1189#error: The <experimental/filesystem> header providing 解决方案

今天开发过程中,需要使用文件系统experimental/filesystem,报错C1189#error: The <experimental/filesystem> header providing ,通过以下解决方案,成功运行程序。 目录 一、打开项目下的属性 二、选择C/…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...