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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

52【场景作图】空间感

参考 场景绘制,画面空间感如何拉开?分分钟就能学会的场景优化思路更新啦!_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1pa411J7Ps/?spm_id_from333.337.search-card.all.click&vd_source20db0c4e2d303527ed13c4b9cdf698ec 1 …

生活实用口语柯桥成人外语培训机构“客服”用英文怎么说?

● 01. “客服”英语怎么说? ● 我们都知道“客服”就是“客户服务”, 所以Customer Service就是#15857575376客服的意思。 但是这里的“客服”指代的不是客服人员, 而是一种Service服务。 如果你想要表达客服人员可以加上具体的职位&a…

Java宝藏实验资源库(1)文件

一、实验目的 掌握文件、目录管理以及文件操作的基本方法。掌握输入输出流的基本概念和流处理类的基本结构。掌握使用文件流进行文件输入输出的基本方法。 二、实验内容、过程及结果 1.显示指定目录下的每一级文件夹中的.java文件 运行代码如下 : import java.io.…

[C++][数据结构][图][中][图的遍历][最小生成树]详细讲解

目录 1.图的遍历1.广度优先遍历2.深度优先遍历 2.最小生成树1.Kruskal算法2.Prim算法 1.图的遍历 给定一个图G和其中任意一个顶点 v 0 v_0 v0​,从 v 0 v_0 v0​出发,沿着图中各边访问图中的所有顶点,且每个顶 点仅被遍历一次 “遍历”&…

# [0619] Task01 绪论、马尔可夫过程、动态规划

easy-rl PDF版本 笔记整理 P1 - P2 joyrl 比对 补充 P1 - P3 相关 代码 整理 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

lib9-03 配置基于时间的 ACL

实验:配置基于时间的 ACL 1、实验目的 通过本实验可以掌握定义 time-range 的方法基于时间 ACL 的配置和调试方法 2、实验拓扑 实验拓扑如下图所示。本实验要求只允许主机 PC1 在周一到周五每天的 8:00-17:00 访问路由器 R3 的Telnet 服务…

Python的三种方式显示图片

from PIL import Image import numpy as np im Image.open("img.png") #方法一:使用PIL库显示图片 a np.array(im) imImage.fromarray(a) im.show() import matplotlib.pyplot as plt #方法二:使用matplotlib库显示图片 plt.imshow(a) plt.s…

Covalent实现对1000亿笔链上交易解析,支持AI长期数据可用性

在区块链与人工智能(AI)交汇处,讨论往往集中于去中心化推理和去中心化训练等方面。然而,这一数据的关键组成部分却一直未得到足够的重视。一个主要问题是:我们如何保护 AI 模型中的数据不受偏见和操纵的影响&#xff1…

linux环境编程基础学习

Shell编程: 相对的chmod -x xx.sh可以移除权限 想获取变量的值要掏点dollar($) 多位的话要加个花括号 运算:expr 运算时左右两边必须要加空格 *号多个含义必须加转义符 双引号可以加反单,但是发过来就不行 …

企业微信,机器人定时提醒

场景: 每天定时发送文字,提醒群成员事情,可以用机器人代替 人工提醒。 1)在企业微信,创建机器人 2)在腾讯轻联,创建流程,选择定时任务,执行操作(企业微信机…

秋招突击——6/19——新作{括号生成、合并K个排序链表}

文章目录 引言新作括号生成个人实现实现时遇到的问题实现代码 参考思路实现代码 合并K个有序链表个人实现实现代码 参考实现实现代码 总结 引言 今天把第二篇论文投了,后续有审稿意见再说,然后在进行修改的。后续的生活要步入正轨了,每天刷题…

FreeRTOS源码分析

目录 1、FreeRTOS目录结构 2、核心文件 3、移植时涉及的文件 4、头文件相关 4.1 头文件目录 4.2 头文件 5、内存管理 6、入口函数 7、数据类型和编程规范 7.1 数据类型 7.2 变量名 7.3 函数名 7.4 宏的名 1、FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工…

Ubuntu服务器搭建Git远程仓库

本文所述方法适用于小型团队在局域网环境中使用Git进行代码版本管理。 1. 安装Git 打开终端(Ctrl + Alt + T) ,输入以下命令: sudo apt update #更新软件包列表信息 sudo apt install git #安装Git 验证Git是否安装成功,可以查看Git版本: git --version 也需…

shell中的流程控制

条件判断在流程控制中的重要性 有了条件判断才能进行if判断即分支流程,才能进行case的多分支流程,才能进行for循环和while循环。 单分支流程判断 如上图所示,在shell编程中常使用英文状态下的分号来在Linux控制台一次性执行多条命令&#x…

无线领夹麦克风哪个牌子好用?一文揭秘哪种领夹麦性价比最高!

​无线领夹麦克风,无疑是现代音频技术的杰出代表。它摆脱了传统有线麦克风的束缚,让声音的传播更加自由、灵活。无论是追求极致音质的音乐爱好者,还是需要高效沟通的商务人士,无线领夹麦克风都能满足你的需求,让你的声…

513、找二叉树左下角的值

题解:层序遍历简单,此篇记录递归法,要注意左下角的值并不一定是左叶子节点,遍历思路形象化就是按先左后右的顺序遍历每一条分支,若遍历到叶子结点,看此时深度有没有超过之前的值,超过了就记录下…

Jlink下载固件到RAM区

Jlink下载固件到RAM区 准备批处理搜索exe批处理调用jlink批处理准备jlink脚本 调用执行 环境:J-Flash V7.96g 平台:arm cortex-m3 准备批处理 搜索exe批处理 find_file.bat echo off:: 自动识别脚本名和路径 set "SCRIPT_DIR%~dp0" set &qu…

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害,以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1:协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…

数据库 | 试卷四

1.数据库系统的特点是 数据共享、减少数据冗余、数据独立、避免了数据不一致和加强了数据保护 2.关系模型的数据结构是二维表结构 3.聚簇索引 cluster index 4. 这里B,C都是主属性,所以B->C不是非主属性对码的部分函数依赖 候选键(AC&a…

光电液位传感器在净水器领域的应用优势有哪些?

光电液位传感器作为一种先进的液位检测技术,在净水器领域有着显著的应用优势。具有高精度的特点,能够精确地检测水位变化,保证水处理过程的稳定性和效率。 传统的浮球式传感器可能存在精度偏差或者在长期使用中需要维护和更换的问题&#xf…