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

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。
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 数据结构:快速排序,归并排序,计数排序的实现分析
  • DSP28335:定时器
  • Linux中ls -lsa 和ls -lst区别
  • leetcode189 轮转数组
  • 快速搭建Jenkins自动化集成cicd工具
  • 高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案
  • 为数据安全护航,袋鼠云在数据分类分级上的探索实践
  • Spring Bean详解
  • 嵌入式实验---实验二 中断功能实验
  • 【计算机网络】[第4章 网络层][自用]
  • vue3+ts 使用vue3-ace-editor实现Json编辑器
  • NV-Embed论文阅读笔记
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】008 - make distclean 命令解析
  • COUNT(id) 和 COUNT(1) 的区别
  • NLP入门——复杂函数建模与链式求导
  • Apache Spark Streaming 使用实例
  • emacs初体验
  • Js基础——数据类型之Null和Undefined
  • Mac转Windows的拯救指南
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • webpack+react项目初体验——记录我的webpack环境配置
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 使用 Docker 部署 Spring Boot项目
  • 使用parted解决大于2T的磁盘分区
  • 事件委托的小应用
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 通过npm或yarn自动生成vue组件
  • 想使用 MongoDB ,你应该了解这8个方面!
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 云大使推广中的常见热门问题
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​低代码平台的核心价值与优势
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (1)(1.9) MSP (version 4.2)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)(3.5) 遥测无线电区域条例
  • (Git) gitignore基础使用
  • (超详细)语音信号处理之特征提取
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)jQuery 基础
  • (转)程序员疫苗:代码注入
  • .bat批处理出现中文乱码的情况
  • .net mvc 获取url中controller和action
  • .Net Redis的秒杀Dome和异步执行
  • .Net 代码性能 - (1)