【RabbitMQ(day3)】扇形交换机和主题交换机的应用
文章目录
- 第三种模型(Publish/Subscribe 发布/订阅)
- 扇型(funout)交换机
- Public/Subscribe 模型
- 绑定
- 第四、第五种模型(Routing、Topics)
- 第四种模型(Routing)
- 主题交换机(Topic Exchange)
- 第五种模型(Topics)
第三种模型(Publish/Subscribe 发布/订阅)
扇型(funout)交换机
扇型交换机将消息路由给绑定到它身上的所有队列,而不会理会绑定的路由键。如果 N 个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的 N 个队列。扇型用来交换机处理消息的广播路由。
因为扇型交换机投递信息的拷贝到所有绑定到它的队列,所以它可以用来在群聊的时候,分发消息给参与群聊的用户。
扇型交换机图例:
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();
结果(有群发那味了):
绑定
- 绑定是交换机将消息路由给队列所需遵循的规则。如果要制定交换机“E”将消息路由给队列“Q”,那么“Q”就需要与“E”进行绑定。绑定操作需要定义一个可选的路由键(routing key)属性给某些类型的交换机(当然像这第三种模型这样的,路由键有没有无所谓的,则不需声明路由键,而前两种模型下,是自动绑定的,交换机则为默认交换机,路由键和队列名一致的。)。路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给绑定的队列,然后消费者再从队列中消费消息。
第四、第五种模型(Routing、Topics)
第四种模型(Routing)
在第三种模型中,一条消息会被所有订阅的队列都消费。但是,在某些场景下,希望不同的消息被不同的队列消费。这时候就需要用直连交换机构建的路由routing模型了。
图解:
- 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
通配符
* (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 修…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...