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

大纲

  • 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.mzph.cn/pingmian/27247.shtml

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

相关文章

基于SpringBoot+VueBBS论坛系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

sku与spu的区别!!!

一个 SPU 可以有多个 SKU。

攻防演练之-成功的钓鱼邮件溯源

书接上文,《网络安全攻防演练风云》专栏之攻防演练之-网络安全产品大巡礼二,这里。 演练第一天并没有太大的波澜,白天的时间过得很快。夜色降临,攻防演练中心内的灯光依旧明亮。对于网络安全团队来说,夜晚和白天并没有…

教育培训知识付费在线课程小程序开发

教育培训知识付费在线课程小程序功能概述 核心功能 课程报名与缴费:支持线上报名、缴费,自定义课程时间、人数等。 砍价功能:用户通过分享邀请好友参与砍价,享受低价购买课程的优惠。 视频课程:支持倍速播放&#x…

Linux 基本指令3

date指令 date[选项][格式] %Y--年 %m--月 %d--日 %H--小时 %M--分 %S--秒 中间可用其他符号分割,不能使用空格。 -s 设置时间,会返回设置时间的信息并不是改变当前时间 设置全部时间年可用-或者:分割日期和时间用空格分隔&#xff…

Qt创建静态库及静态库使用

Qt创建静态库及静态库使用 1. 创建一个库文件 选择静态库 将需要打包的.h 和.cpp文件添加到程序中, 在编译器版本下的debug和release模式下分别编译(右键项目,点击“qmake”,再点击“构建”)后,在对应的的build目录下…

“探索机器学习的多面世界:从理论到应用与未来展望“

博客主页:誓则盟约系列专栏:机器学习 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 一、机器学习基础理论 1.机器学习的定义与分类 监督学习 无监督学…

Python数据分析与机器学习在医疗诊断中的应用

文章目录 📑引言一、数据收集与预处理1.1 数据收集1.2 数据预处理 二、特征选择与构建2.1 特征选择2.2 特征构建 三、模型选择与训练3.1 逻辑回归3.2 随机森林3.3 深度学习 四、模型评估与调优4.1 交叉验证4.2 超参数调优 五、模型部署与应用5.1 模型保存与加载5.2 …

Python:从头创建 Asyncio (2)

引言 现在,asyncio 已成为 Python 社区中的热门话题,并且名副其实——它提供了一种非常出色的处理 I/O 密集型程序的方法!在我探索 asyncio 的过程中,我起初并不太明白它的工作原理。但随着深入学习,我意识到 asyncio …

Java 反射机制 -- Java 语言反射的概述、核心类与高级应用

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 010 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…

GitLab教程(二):快速上手Git

文章目录 1.将远端代码克隆到本地2.修改本地代码并提交到远程仓库3.Git命令总结git clonegit statusgit addgit commitgit pushgit log 首先,我在Gitlab上创建了一个远程仓库,用于演示使用Gitlab进行版本管理的完整流程: 1.将远端代码克隆到本…

导出 Whisper 模型到 ONNX

前言 在语音识别领域,Whisper 模型因其出色的性能和灵活性备受关注。为了在更多平台和环境中部署 Whisper 模型,导出为 ONNX 格式是一个有效的途径。ONNX(Open Neural Network Exchange)是一个开放格式,支持不同的深度…

吴恩达2022机器学习专项课程C2W3:2.25 理解方差和偏差(诊断方差偏差正则化偏差方案搭建性能学习曲线)

目录 引言名词替代影响模型偏差和方差的因素1.多项式阶数2.正则化参数 判断是否有高偏差或高方差1.方法一:建立性能基准水平2.方法二:建立学习曲线 总结 引言 机器学习系统开发的典型流程是从一个想法开始,然后训练模型。初次训练的结果通常…

今日分享丨inBuilder低代码平台打印格式设计器

打印在企业日常办公中占据核心地位,是处理各种关键文件不可或缺的一环。无论是签署合同、报销费用、记录凭证与账表、处理回单与库存单据、开出库单据,还是开具发票、制作条码与标签,打印都发挥着至关重要的作用,确保企业运营的高…

rv1126-rv1109-串口显示路径不变化

串口只有#, 后来看了教程改成如下 但是没有变化,那个路径都只显示rootLonbon# 于是最后改成了这样 因为:

linux 安装sftp及使用sftp上传和下载

一、centos7 安装sftp 1.安装 OpenSSH 服务: sudo yum install openssh-server2.启动 SSH 服务,并设置为开机启动: sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户,用于SFTP连接(替换your_…

【C++高阶】C++继承学习手册:全面解析继承的各个方面

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模板进阶 🌹🌹期待您的关注 🌹🌹 继承 📖1. 继承的概念及定义…

MPLS提高网络服务质量的原理

MPLS(Multiprotocol Label Switching,多协议标签交换)是一种网络技术,它能够提高网络的服务质量(Quality of Service,QoS)以及整体性能。MPLS通过以下几种方式来提升网络服务质量:标…

220v转3v用多大电阻

在设计一个电压转换电路,将220V交流(AC)电压转换为3V直流(DC)电压时,我们需要考虑几个关键因素,包括安全、效率和电路的稳定性。AH8651是一款DC-DC转换器,通常用于将较高的输入电压转…