RabbitMQ实践——交换器(Exchange)和绑定(Banding)

news2025/2/27 19:12:00

大纲

  • direct型交换器
    • 默认交换器
    • 命名交换器
  • fanout型交换器
  • topic型交换器
  • headers型交换器

RabbitMQ在概念上由三部分组成:

  • 交换器(Exchange):负责接收消息发布者发布消息的结构,同时它会根据“绑定关系”(Banding)将消息投递到符合规则的队列中。
  • 队列(Queue):消息索引组成的先进先出(FIFO)结构。交换器会将消息投递到该结构,消费者会消费该结构上的数据。它相当于一个仓储。
  • 绑定关系(Banding):用于定义交换器投递消息到队列的规则。
    在这里插入图片描述
    本文我们将关注交换器(Exchange)和绑定(Banding)部分,观察它们是如何协作将消息投递到对应队列中。
    本文仍然使用《RabbitMQ实践——在管理后台测试消息收发功能》中介绍的方法,直接在后台上操作,不涉及任何代码。RabbitMQ已经给我们初始化了各种交换器,我们将基于它们去做测试。
    实验之前,我们先建立若干个队列。具体方法如下
    在这里插入图片描述

direct型交换器

direct是最普通和常用的交换器。它可以将一个消息投递到一个或者多个队列,但是它只能使用Banding中的Routing key做完全匹配。也就说,只有消息中的Routing key和Banding中的Routing key完全一致时,才会将消息投递到Banding对应的队列中
在这里插入图片描述

默认交换器

默认交换器是一种direct型交换器。它简化了绑定关系(Banding),即用户不需要自己定义绑定关系(Banding),而是将队列的名称作为Routing Key使用。这样只要消息的Routing Key是队列名称,发送到该交换器后,就会被投递到对应的队列上。默认的,所有队列都会和默认交换器关联
在这里插入图片描述

默认交换器位于如下位置
在这里插入图片描述
然后使用下面方法发送Routing key为named_queue_a、named_queue_c和named_queue_d的消息
在这里插入图片描述
由于named_queue_a、named_queue_c这两个队列存在,所以在发送Routing key为named_queue_a、named_queue_c的消息时,会看到如下提示。
在这里插入图片描述
但是named_queue_d队列不存在,所以发送Routing key为named_queue_d的消息会失败。
在这里插入图片描述
在队列页面,我们看到named_queue_a、named_queue_c各有一条消息,而named_queue_b则没有,因为我们没有发送Routing key为named_queue_b的消息到默认交换器。
在这里插入图片描述

命名交换器

命令交换器并不会自动和所有队列关联,它需要通过绑定关系(Banding)来定义投递规则来将交换器和队列关联起来。
我们使用下面的交换器做测试在这里插入图片描述
然后使用下面的步骤新增三个绑定关系(Banding)
在这里插入图片描述
最终关系如下
在这里插入图片描述
最后发送消息,消息的Routing key是to_b。
可以在队列表中看到消息被投递到named_queue_b队列上。
在这里插入图片描述
在这里插入图片描述

fanout型交换器

fanout型交换器是一种扇出型交换器。它将消息投递到所有和它绑定的队列上。
这次我们使用的是下图的交换器
在这里插入图片描述
然后配置Banding关系。这次我们只要指定队列名称,而不用指定Routing key。(即使指定了Routing Key,也不会生效)
在这里插入图片描述
绑定完三个队列后
在这里插入图片描述
然后发布一条消息,只用指定内容,不用指定Routing key。
在这里插入图片描述
可以看到这条消息被发布到三个队列里了。
在这里插入图片描述
在这里插入图片描述

topic型交换器

之前介绍的direct型交换器要求Routing key完全相同才能投递,这明显限制了灵活性。而Topic型交换器则支持Routing key的简单正则匹配。之所以成为“简单”,是因为它只支持*和#通配符。
Topic型交换器的Routing key要组织形式是:通过.分割的字符串,比如a.b.c。
*表示通配所有.号之前的内容;#表示通配所有字符(包括后续的.)。
举一些例子:

  • a..:可以匹配a.b.c,但是不能匹配a.b.c.d。这是因为a.*.*结构要求只有3段,而a.b.c.d有4段。
  • a.#:可以匹配a.b.c和a.b.c.d,但是不能匹配b.c.d.a。
  • #.c:可以匹配a.c、a.b.c,但是不能匹配a.b.c.d、c.d.e。

这次我们使用下面的转换器
在这里插入图片描述

如下配置出下面的Banding关系,即只要Routing key中某段(两.之间,或者开头和结尾)是a,则投递到队列named_queue_a。以此类推named_queue_b和named_queue_c。
如果我们发送的Routing key是a.b.c的消息
在这里插入图片描述
则会按照Banding规则,投递到对应的队列上。
在这里插入图片描述
这儿需要注意一点:如果通配规则有重叠,即消息的Routing key匹配了多个通配规则,而这些通配规则都是投递到1个队列上,则消息只会被投递到该队列上1次,而不是匹配的次数。
比如Routing key是a.a.a的消息,它匹配了a.#、#.a.#和#.a这些规则。这些规则都指向了named_queue_a。这时这条消息只会被投递到队列named_queue_a上一次。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

headers型交换器

Header型交换器不像direct和topic型需要匹配Routing key,而是匹配Banding中的Argument和Message中的Header。它有两种模式:

  • 完全相同:Message中的Header保存的键值对都在Banding中的Argument的键值对中,则匹配上。需要Banding的Argument设置x-match=all
  • 部分匹配:Message中的Header保存的键值对部分在Banding中的Argument的键值对中,则匹配上。需要Banding的Argument设置x-match=any

这次我们使用下图的交换器
在这里插入图片描述
然后配置如下的Banding关系
在这里插入图片描述
如果消息Header中有from=a和to=b的,会被投递到named_queue_b。
在这里插入图片描述

如果消息Header中有from=a或者to=c的,会被投递到named_queue_c。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

PySide(PyQt)的特殊按钮(互锁、自锁、独占模式)

界面图: Qt Designer中创建窗口,放置一个QGroupBox,命名为btnStation,这就是自定义的按钮站,按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮,每按一次状态反转并保持不变。独占按钮也是自锁功…

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError 报错信息如下: Traceback (most recent call last): asyncio.run(main()) File “D:\miniconda3\envs\py31013\lib\asyncio\runners.py”, line 44, in…

Python酷库之旅-比翼双飞情侣库(17)

目录 一、xlwt库的由来 1、背景和需求 2、项目启动 3、功能特点 4、版本兼容性 5、与其他库的关系 6、示例和应用 7、发展历史 二、xlwt库优缺点 1、优点 1-1、简单易用 1-2、功能丰富 1-3、兼容旧版Excel 1-4、社区支持 1-5、稳定性 2、缺点 2-1、不支持.xls…

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如,一名黑客利用了 Paid 网络的智能…

第三十三章 添加和使用自定义标题元素

文章目录 第三十三章 添加和使用自定义标题元素SOAP 标头元素简介如何表示 SOAP 标头 第三十三章 添加和使用自定义标题元素 本主题介绍如何添加和使用自定义 SOAP 标头元素。 有关发生故障时添加标头元素的信息,请参阅 SOAP 故障处理。 WS-Addressing 标头元素在…

Java swing JTable 示例

代码, import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable;public class Mylmlk {public static void main(String[] agrs){JFrame framenew JFrame("学生成绩表");frame.setSize(500,2…

it职业生涯规划系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,职业介绍管理,答题管理,试题管理,基础数据管理 前台账户功能包括:系统首页,个人中心,在线答题&#xff0…

QT基础 - QMainWindow主窗口

目录 零. 简介 一. 菜单栏 二. 工具栏 三. 状态栏 四. 可停靠区域 五. 总结 零. 简介 QMainWindow 是 Qt 中用于构建主窗口的类。 它通常包含以下几个主要部分: 菜单栏:用于提供各种操作选项。工具栏:放置常用的操作按钮。中心区域&…

DAMA学习笔记(二)-数据治理

1.引言 数据治理(Data Governance,DG)的定义是在管理数据资产过程中行使权力和管控,包括计划、监控和实施。在所有组织中,无论是否有正式的数据治理职能,都需要对数据进行决策。建立了正式的数据治理规程及…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵, 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

排序算法及源代码

堆排序: 在学习堆之后我们知道了大堆和小堆,对于大堆而言第一个节点就是对大值,对于小堆而言,第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆,如此下去就可以实现建堆排…

【Java】已解决java.util.concurrent.TimeoutException异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.util.concurrent.TimeoutException异常 一、问题背景 java.util.concurrent.TimeoutException是Java并发编程中常见的一个异常,它通常发生在使用Future或Future…

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路 摘录 《把你写进诗歌里(2020年度中国优秀诗歌)》,作者上官文露。并不惊艳,中英文双语对照的一本诗集&…

OpenGL3.3_C++_Windows(13)

demo演示 demo演示 面剔除 当我们都以逆时针绘制三角形顶点,那么从三角形的背面看就是顺时针,面剔除正是根据这个原理,glEnable()首先启用,glCullFace()改变需要剔除的面类型&#…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程(类的生命周期)3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

初阶 《数组》 1. 一维数组的创建和初始化

1. 一维数组的创建和初始化 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小数组创建的实例: //代码1 int ar…

计算机图形学入门16:曲线

1.曲线 曲线(Curves)在图形学中应用非常广泛,比如:相机的拍摄路径、物体的移动路径、动画曲线、矢量字体等。如下图所示,是使用曲线到矢量字体的应用,通过移动一些控制点来改变字体。 2.贝塞尔曲线 2.1 贝…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…

MyPostMan:按照项目管理接口,基于迭代生成接口文档、执行接口自动化联合测试

MyPostMan 是一款类似 PostMan 的接口请求软件,不同于 PostMan 的是,它按照 项目(微服务)、目录来管理我们的接口,基于迭代来管理我们的接口文档,按照迭代编写自动化测试用例,在不同环境中均可运…