【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),这个过程可以是自动的,也可以由处理消息的应用的开发者执行。当 “消息确认” 启用时,消息代理需要收到来自消费者的确认回执后,才完全将消息从队列中删除。

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

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

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

相关文章

docker hub仓库被禁用,镜像加速器站点替换

整理 站点整理之前用的daemon.json,现更改镜像加速地址替换自己的docker加速器daemon.json前面加https:// 站点整理 之前用的daemon.json,现更改镜像加速地址 vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xgbe4ey.mirror.aliyuncs.com",…

计算缺失msvcr120.dll文件怎么办,msvcr120.dll丢失的解决方法分享

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到msvcr120.dll”。那么,msvcr120.dll到底是什么?为什么计算机会找不到它?它会对计算机产生什么具体影响?如何解决这个问题?…

vue框架学习------框架概述

框架 在基础语言之上,对各种基础功能进行封装 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法; 另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而…

正能量情感语录热门素材文案去哪里找?文案素材网站分享

正能量情感语录热门素材文案去哪里找?文案素材网站分享 想为你的作品注入正能量和情感温度?不知如何获取热门情感语录素材?别担心,今天我将为大家推荐一些海外知名的素材网站,让你轻松找到受欢迎的文案素材&#xff…

8295平台定时抓取温度、hogs和top等日志脚本

一、简介 本脚本是开启定时记录温度、hogs和top等日志的脚本,用于特定问题的调试,默认不会开启。 本脚本可以定时把记录到的信息打印到文本和终端,hogs不会打印到终端。 下面保存成一个diff, 代码应用到工程 qcom/es17/QNX: diff --git a/…

Ubuntu20.04 使用scrapy-splash爬取动态网页

我们要先安装splash服务,使用dock安装,如果dock没有安装,请参考我的上一篇博文: 按照官方文档:https://splash.readthedocs.io/en/stable/install.html 1.下载splash sudo docker pull scrapinghub/splash2.安装scrapy…

软考 系统架构设计师系列知识点之杂项集萃(37)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(36) 第60题 用例(use case)用来描述系统对事件做出响应时所采取的行动。用例之间是具有相关性的。在一个“订单输入子系统”中,创建新订单和更新订…

ffmpeg解封装rtsp并录制视频-(1)解封装rtsp断网或摄像机重启后自动重连处理

头文件&#xff1a; xtools.h #pragma once #include <thread> #include <iostream> #include <mutex> //日志级别 DEBUG INFO ERROR FATAL enum XLogLevel {XLOG_TYPE_DEBUG,XLOG_TYPE_INFO,XLOG_TPYE_ERROR,XLOG_TYPE_FATAL }; #define LOG_MIN_LEVEL XLO…

dp练习题

先来一个简单dp练习 class Solution { public:int rob(vector<int>& nums) {int n nums.size();vector<int> a(n 1);int ans nums[0]; a[0] nums[0];if (n 1) return ans;a[1] max(nums[0], nums[1]);ans max(ans, a[1]);if (n 2) return ans;for (i…

洛谷-P7071 [CSP-J2020] 优秀的拆分

[CSP-J2020] 优秀的拆分 题目描述 一般来说&#xff0c;一个正整数可以拆分成若干个正整数的和。 例如&#xff0c; 1 1 11 11&#xff0c; 10 1 2 3 4 101234 101234 等。对于正整数 n n n 的一种特定拆分&#xff0c;我们称它为“优秀的”&#xff0c;当且仅当在这种…

工厂方法模式和抽象工厂

工厂方法模式的核心思想就是为每种产品定义一个创建工厂方法的工厂类&#xff0c;核心就是面向接口编程 成员包含&#xff1a; &#xff08;1&#xff09;产品接口&#xff0c;工厂接口 &#xff08;2&#xff09;产品实现类&#xff0c;工厂实现类 产品接口和具体产品类 // …

xss+csrf项目实例

项目背景&#xff1a; 如下&#xff1a;我们是在一个类似文章管理系统的网站上面发现的该漏洞。我们将其运行在本地的phpstudy集成环境上面。 源码地址下载链接&#xff1a;https://pan.baidu.com/s/1MpnSAq7a_oOcGh4XgPE-2w 提取码&#xff1a;4444 考察内容&#xff1a; …

分布式锁的几种形式以及优缺点

在分布式系统中,分布式锁是一种用于控制对共享资源访问的机制,以确保多进程、多线程环境下的数据一致性。分布式锁有多种实现方式,本文将介绍几种常见的分布式锁及其优缺点。 一、基于数据库的分布式锁 实现方式 表锁:使用数据库提供的锁机制,例如 MySQL 的 SELECT ... …

【JavaScript脚本宇宙】提升Markdown工作流:不可错过的六个JavaScript库

优化你的Markdown体验&#xff1a;六大JavaScript库一网打尽 前言 在现代Web开发中&#xff0c;Markdown作为一种轻量级的标记语言&#xff0c;凭借其简洁易读的语法和广泛的适用性&#xff0c;迅速成为开发者们的宠儿。为了更有效地解析和处理Markdown内容&#xff0c;JavaS…

10 C++11

10 C11 1、类型推导1.1 auto关键字1.2 auto类型推断本质 2、类型计算2.1 类型计算分类2.2 类型计算的四种规则2.3 返回值类型计算 3、列表初始化4、Lambda表达式4.1 前置知识4.2 Lambda表达式4.3 捕获表 5、右值引用5.1 概念5.2 左值引用和右值引用 6、移动语义 1、类型推导 1…

中断里用信号量而不用消息队列

在嵌入式开发中&#xff0c;中断处理程序&#xff08;ISR&#xff09;是一个非常重要的部分。ISR需要非常高效地运行&#xff0c;以确保系统能够及时响应硬件事件。使用信号量和消息队列都是常见的同步机制&#xff0c;但它们在中断上下文中的使用有不同的限制和建议。 信号量…

嵌入式复古游戏项目开发与实现

大家好,今天看到一个火柴盒项目,非常的小巧,分享给大家,感兴趣的话,可以复刻一个玩一玩。 MicroByte 是一款微型主机,能够运行 NES、GameBoy、GameBoy Color、Game Gear 和 Sega Master 系统的游戏,所有元器件都设计在这 78 x 17 x 40 mm 的封装中。尽管成品尺寸很小,但…

AI预测体彩排3采取888=3策略+和值012路或胆码测试6月16日升级新模型预测第1弹

根据前面的预测效果&#xff0c;我对模型进行了重新优化&#xff0c;因为前面的模型效果不是很好。熟悉我的彩友比较清楚&#xff0c;我之前的主要精力是对福彩3D进行各种模型的开发和预测&#xff0c;排三的预测也就是最近1个月才开始搞的。3D的预测&#xff0c;经过对模型的多…

Java面向对象-接口

Java面向对象-接口 一、JDK1.8之前二、接口的作用三、JDK1.8之后&#xff0c;新增非抽象方法四、静态方法 一、JDK1.8之前 1、类是类&#xff0c;接口是接口&#xff0c;它们是同一层次的概念 2、接口中没有构造器 3、接口如何声明&#xff1a;interface 4、在jdk1.8之前&…

002 IOC和DI使用

文章目录 基于XML的使用IOC配置第三种:实例工厂(了解)DI配置构造函数注入set方法注入(重点)使用p名称空间注入数据依赖注入不同类型的属性 基于注解和XML混合方式的使用IoC注解使用方法IoC注解(创建对象)DI注解(依赖注入)关于注解和XML的选择问题 基于纯注解方式使用注解和XML混…