【RabbitMQ(day3)】扇形交换机和主题交换机的应用
文章目录
- 第三种模型(Publish/Subscribe 发布/订阅)
- 扇型(funout)交换机
- Public/Subscribe 模型
- 绑定
- 第四、第五种模型(Routing、Topics)
- 第四种模型(Routing)
- 主题交换机(Topic Exchange)
- 第五种模型(Topics)
第三种模型(Publish/Subscribe 发布/订阅)
扇型(funout)交换机
扇型交换机将消息路由给绑定到它身上的所有队列,而不会理会绑定的路由键。如果 N 个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的 N 个队列。扇型用来交换机处理消息的广播路由。
因为扇型交换机投递信息的拷贝到所有绑定到它的队列,所以它可以用来在群聊的时候,分发消息给参与群聊的用户。
扇型交换机图例:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTprwNAp-1690737452900)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730165558799.png)]](https://img-blog.csdnimg.cn/95a1ae41c12441328528c2b39fed6131.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-seBDWtoY-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730165644205.png)]](https://img-blog.csdnimg.cn/a1e618b7717a40adac4095304091aa8c.png)
Public/Subscribe 模型
在这种模式下,消息发送流程是这样的:
- 可以有多个消费者;
- 每个消费者有自己的 queue(队列)
- 每个队列都要绑定到 Exchange(交换机)
- 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
- 交换机把所有的消息发送给绑定过的所有队列。
- 队列的消费者都能拿到消息。实现一条消息被多个消费者消费。
- 开发生产者
// 将通道声明指定的交换机// 参数1:交换机的名称// 参数2:交换机的类型channel.exchangeDeclare("logs","fanout");// 发送消息channel.basicPublish("logs","",null,"fanout type message".getBytes());
- 开发消费者
// 通道声明交换机channel.exchangeDeclare("logs","fanout");// 临时队列String queueName = channel.queueDeclare().getQueue();// 队列绑定交换机channel.queueBind(queueName,"logs","");
实例代码:
Runnable myRunnable = () -> {try {Connection conn = RabbitMQUtils.getConnection();Channel channel = conn.createChannel();// 通道声明交换机channel.exchangeDeclare("logs", "fanout");// 临时队列String queueName = channel.queueDeclare().getQueue();// 队列绑定交换机channel.queueBind(queueName, "logs", "");// 消费消息channel.basicConsume(queueName, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消费者" + consumerTag + ":" + new String(body));}});} catch (IOException e) {e.printStackTrace();}};Thread t1 = new Thread(myRunnable);Thread t2 = new Thread(myRunnable);Thread t3 = new Thread(myRunnable);t1.start();t2.start();t3.start();
结果(有群发那味了):
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aO7A1Bp9-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730174044020.png)]](https://img-blog.csdnimg.cn/3d72a482ab7c40e888f301f38c854c27.png)
绑定
- 绑定是交换机将消息路由给队列所需遵循的规则。如果要制定交换机“E”将消息路由给队列“Q”,那么“Q”就需要与“E”进行绑定。绑定操作需要定义一个可选的路由键(routing key)属性给某些类型的交换机(当然像这第三种模型这样的,路由键有没有无所谓的,则不需声明路由键,而前两种模型下,是自动绑定的,交换机则为默认交换机,路由键和队列名一致的。)。路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给绑定的队列,然后消费者再从队列中消费消息。
第四、第五种模型(Routing、Topics)
第四种模型(Routing)
在第三种模型中,一条消息会被所有订阅的队列都消费。但是,在某些场景下,希望不同的消息被不同的队列消费。这时候就需要用直连交换机构建的路由routing模型了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPCNxtpC-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230731002003368.png)]](https://img-blog.csdnimg.cn/b8166c933d08489aa987b8cf8db785b2.png)
图解:
- P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
- X:Exchange(交换机),接收生产者的消息,然后把消息递交给与routing key完全匹配的队列。
- C1:消费者,其所在队列指定了需要routing key 为error的消息。
- C2:消费者,其所在队列指定了需要routing key 为 info、error、warning的消息。
- 开发生产者
// 通过通道声明交换机channel.exchangeDeclare("logs_routing", "direct");// 发送消息String routingKey = "info";channel.basicPublish("logs_routing", routingKey, null, ("这是direct模型发布的基于route key:" + routingKey).getBytes());
- 开发消费者
// 通道声明交换机以及交换的类型channel.exchangeDeclare("logs_routing", "direct");// 创建一个临时队列String queueName = channel.queueDeclare().getQueue();// 基于route key 绑定队列和交换机channel.queueBind(queueName, "logs_routing", "error");
主题交换机(Topic Exchange)
主题交换机通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列(注意这是消息给一个或多个队列,和直连交换机可不同,直连是路由键和队列同名,一个消息对应一个队列这种才是直连)。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由(与第三种模型的广播路由不同)。
主题交换机拥有非常广泛的用户案例。当一个问题涉及到那些想要有针对性的选择需要接收消息的多消费/多应用的时候,主题交换机都可以被列入考虑范围。
第五种模型(Topics)
主题交换机和直连交换机相比,都是可以根据 routingkey 把消息路由到不同的队列。只不过主题交换机可以让队列在绑定 routingkey 的时候使用通配符。这种模型 routingkey 一般都是由一个或者多个单词组成,多个单词之间以.分割,例如:item.insert
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBnGlwKf-1690737452902)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230731005829465.png)]](https://img-blog.csdnimg.cn/bca6ef4a57e14decbb959d8c7e1421dd.png)
通配符
* (star) can substitute for exactly one word. 匹配一个单词
# (hash) can substitute for zero or more words. 匹配一个或多个单词如:
audit.# 匹配audit.irs.corporate 或者 audit.irs 等
audit.* 只能匹配audit.irs
- 生产者
// 声明交换机以及交换机类型channel.exchangeDeclare("topics", "topic");// 发布消息String routeKey = "user.delete";channel.basicPublish("topics", routeKey, null, ("这里是topic动态路由模型,route key:" + routeKey).getBytes());
- 消费者
// 生命交换机以及交换机类型channel.exchangeDeclare("topics", "topic");// 创建一个临时队列String queueName = channel.queueDeclare().getQueue();// 绑定队列和交换机 动态通配符形式 route keychannel.queueBind(queueName, "topics", "use.*");
案例结果

相关文章:
【RabbitMQ(day3)】扇形交换机和主题交换机的应用
文章目录 第三种模型(Publish/Subscribe 发布/订阅)扇型(funout)交换机Public/Subscribe 模型绑定 第四、第五种模型(Routing、Topics)第四种模型(Routing)主题交换机(To…...
redis 高级篇 redis 源码的读取分析
一 redis源码分析 1.1 源码分析 1每一个kv键值对应有一个dictEntry。 2.底层数据结构...
Acwing.873.欧拉函数
题目 给定n个正整数ai,请你求出每个数的欧拉函数。 输入格式 第一行包含整数n。 接下来n行,每行包含一个正整数ai。 输出格式 输出共n行,每行输出一个正整数an的欧拉函数。 数据范围 1 ≤n ≤100 1≤ai≤2* 109 输入样例: 3 3 6 8输…...
深入浅出FPGA——笔记7 代码风格
1 寄存器电路的设计方式 废话:时序逻辑设计是核心,而寄存器又是时序逻辑的基础。 1: 简单的时序输入输出模型 如下图所示,在每个时钟信号clk的有效沿(通常是上升沿),输入端数据din将被锁存到输出端dout。…...
npm, yarn配置
一、npm 1. 查看当前的镜像源。 npm config get registry 2. 设置为淘宝源 npm config set registry https://registry.npm.taobao.org 3. 还原默认源 npm config set registry https://registry.npmjs.org/ 二、Yarn 1.yarn的安装 npm install -g yarn 2. 查看当…...
跨域情况下,vue如何下载后台接口提供的application/octet-stream文件流Excel文件
前言 由于跨域,所以无法直接通过window.location.href或者a标签直接下载,直接拼后台接口地址又暴露了后台地址,不可行。 所以在这种跨域情况下,本章讲一下vue如何下载后台接口提供的application/octet-stream文件流Excel文件。 …...
学C的第三十一天【通讯录的实现】
相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十天【自定义类型:结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求: 实现一个通讯录, 通讯录中存放保存人的信息࿱…...
Linux操作系统学习,Linux基础命令大全
目录 第一章、Linux简介和安装1.1)Linux简介和分类1.2)安装VMware虚拟机,在虚拟机中安装CentOS 7 第二章、虚拟机中Linux的IP地址配置详解2.1)什么是IP地址,如何查看2.2)虚拟机NAT模式中Linux的IP地址设置有…...
【软件测试】说说你对TDD测试驱动开发的理解?
很多公司在面测试中高级岗时,都会不同程度地问到“有没有了解过TDD”“你认为TDD可以解决什么问题”或者“说说测试驱动开发的流程”等等,即使公司并不会用到此开发流程,面试官也会通过你对这个相对还比较“陌生”的概念的讲述来了解你对一些…...
B. Binary Cafe(二进制的妙用)
题目:Problem - B - Codeforces 总结: 对于该题最简单的方法为使用二进制的数表示状态 例如: 对于一个数7的二进制:111 它的每一位都可表示两种状态我们可以理解为取或者不取 对于7这个数字它可以表示一种状态即在三个位置都…...
SpringBoot单元测试
目录 1.什么是单元测试? 2.单元测试有哪些好处? 3.Spring Boot单元测试使⽤ 单元测试的实现步骤 1. ⽣成单元测试类 2. 添加单元测试代码 2.1 .添加Spring Boot框架测试注解:SpringBootTest 2.2 添加单元测试业务逻辑 简单的断⾔说明 1.什么是单元测试? 单元测试(un…...
刷题 41-45
四十一、移除元素 示例 1: 输入:nums [3,2,2,3], val 3 输出:2, nums [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 …...
Centos时间同步
前言 在 Linux 操作系统中,正确的时间同步是非常重要的,因为它对于很多应用程序都是必需的。本文将介绍两种在 Centos 系统中同步当前时间的方式。 方法一:使用 ntpdate 命令同步当前时间 ntpdate 命令是一种简单快捷的同步当前时间的方式&a…...
Linux 查看磁盘空间
1 查看当前目录的总大小 :du -sh ps:du(disk usage) 2 查看某个目录的总大小:du -sh 目录名 3 查找出/目录下占用空间最大的前10个文件或者文件夹:sudo du -a / | sort -n -r | head -n 10 4 查看磁盘信息:df -h...
我的会议(我的审批,会议签字附源码)
目录 前言: 3.我的审批: 3.1实现的特色功能: 3.2显示的效果 3.3思路: 3.4寻找相关的案例或者自己使用JavaScript去写一个类似的功能 3.5具体的步骤: 3.5.1添加静态的jsp代码(我的审批数据的显示&…...
Python 装饰器该如何理解?
哈喽大家好,今天带大家了解下在Python中装饰器的使用 定义 首先我们先来了解下装饰器的定义。顾名思义,在Python中,装饰器本质上就是一个函数,它可以接收一个函数作为参数,然后返回一个新的函数。这个新的函数可以在…...
IDEA 模块不加载依旧是灰色 没有变成小蓝色的方块
Settings > Build, Execution, Deployment > Build Tools > Maven > Ignored Files下降对应的模块勾选掉 但通常在Maven的配置中,您会找到一个名为“ignoredFiles”的列表,其中包含被忽略的文件和目录。您可以通过取消选中所需的文件或目录…...
可以写进简历的kafka优化-----吞吐量提升一倍的方法
冲突 在看到项目工程里kafka 生产端配置的batch.size为500,而实际业务数据平均有1K大小的时候;我有点懵了。是的,这里矛盾了;莫非之前的作者认为这个batch.size是发送的条数,而不是kafka生产端内存缓存记录的大小&…...
JavaScript中,for in 和for of的区别
for in 遍历的是数组的索引(即键名),而 for of 遍历的是数组元素值(即键值)。for...in 循环出的是 key,for...of 循环出的是 value 推荐在循环对象属性的时候使用 for...in,在遍历数组的时候的时…...
计算机毕设 深度学习手势识别 - yolo python opencv cnn 机器视觉
文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
