当前位置: 首页 > 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/…...

Elixir学习笔记——速构(函数式编程基础)

在 Elixir 中,循环遍历 Enumerable 是很常见的,通常会过滤掉一些结果并将值映射到另一个列表中。 速构是此类构造的语法糖:它们将这些常见任务分组为 for 特殊形式。 例如,我们可以将一串整数映射到它们的平方值: 速构…...

开源项目大合集(热门)

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...

【JVM】JVisualVM的介绍、使用和GC过程

VisualVM介绍 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几…...

个人在家如何获取World Scientific文献的经验分享

今天有位同学求助一篇World Scientific文献,他的学校虽然有这个数据库,但订购的该数据库资源内容有限,这位同学所需的文献不在学校订购范围内所以下载不了。今天小编就分享一个在家就可获取各个数据库文献的方法。本文以这篇求助文献为例&…...

Java 收集常见面试题

set和list的区别?给定一系列字符串,从集合的set和list中查询,如何查询出相关的数据? 在Java中,Set和List都是用于存储对象的集合 Set: 不允许包含重复的元素。 没有顺序(即不保证元素的迭代顺序…...

JS 严格模式和正常模式的区别

严格模式使用"use strict"; 作用: 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;消除代码运行的一些不安全之处,保证代码运行的安全;提高编译器效率,增加运行速度;为未来新…...

9种编程语言的对比分析

在当今的软件开发领域,编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景,选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析,帮助读者了解它们的优缺点和适用场景。 Java 特点&…...

模拟14位相机输出Verilog代码

1 代码 `timescale 1ns / 1psmodule simulate_camera_out (input clk,input rest_n,output camera_clk, //像素时钟output [13:0] camera_data, //像素值数据output [19:0] pixel_xy, //此时输出的像素值坐标output reg frame_valid //帧有效信号,1代表帧有效0代表帧无效…...

Linux远程访问及控制

SSH远程管理 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。与早期的 Telent(远程登录)、RSH(Remote Shell,远程执…...

归并排序个人见解

归并排序个人见解 思路实现代码实现题目 思路实现 归并排序属于分治算法,分治算法有三个步骤: 分:将问题划分为多个规模较小的子问题,这些子问题与原始问题相似。治:递归地解决这些子问题。如果子问题足够小&#xf…...

wordpress本地添加图片不显示图片/站内推广有哪些具体方式

本地方法栈 Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的) 如果线程请求分配的栈容量超过本…...

郑州建网站公司/乐陵市seo关键词优化

1、本系统的后台使用mysql数据库,SSH 框架,前端使用ExtJs实现。因为系统需要用到权限管理,所以作此记录,权限管理精确到前端的每一个按钮,甚至每一个action请求。废话不多说,直接进入主题(一&am…...

东营运政信息网官网查询/百度seo营销推广多少钱

一、基本概念 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 导入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><ar…...

英语网站建设/培训seo去哪家机构最好

一、前言 请务必看到最后。Python牛已经不是一天两天的事了&#xff0c;但是我开始也没想到&#xff0c;Python能这么牛。前段时间接触了一个批量抠图的模型库&#xff0c;而后在一些视频中找到灵感&#xff0c;觉得应该可以通过抠图的方式&#xff0c;给视频换一个不同的场景&…...

企业营销网站建设费用预算/北京百度seo

欢迎访问 Snippet:2021/6/24 8:36 下午 致谢: &#x1f330; 手把手带你爬取小姐姐私房照&#x1f34e; 一座城市一个故事 问题概述: &#x1f433; &#x1f42d; 使用Python获取朴缜《东方幻月录》中古风城市图片 &#x1f433; &#x1f42d;方案细节 &#x1f433; 介绍…...

pc端网站建设相关查阅资料/今天国内新闻10条

首先&#xff0c;我们先普及一下编程语言的基础知识。其实无论用任何编程语言来开发程序&#xff0c;都是为了让计算机干活&#xff0c;比如编写一篇文章&#xff0c;下载一首MP3等&#xff0c;而计算机干活的CPU只认识机器的指令&#xff0c;所以&#xff0c;尽管不同的编程语…...