【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)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-seBDWtoY-1690737452901)(C:\Users\myz03\AppData\Roaming\Typora\typora-user-images\image-20230730165644205.png)]

Public/Subscribe 模型

在这种模式下,消息发送流程是这样的:

  • 可以有多个消费者;
  • 每个消费者有自己的 queue(队列)
  • 每个队列都要绑定到 Exchange(交换机)
  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
  • 交换机把所有的消息发送给绑定过的所有队列。
  • 队列的消费者都能拿到消息。实现一条消息被多个消费者消费。
  1. 开发生产者
        // 将通道声明指定的交换机// 参数1:交换机的名称// 参数2:交换机的类型channel.exchangeDeclare("logs","fanout");// 发送消息channel.basicPublish("logs","",null,"fanout type message".getBytes());
  1. 开发消费者
        // 通道声明交换机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)]

绑定

  • 绑定是交换机将消息路由给队列所需遵循的规则。如果要制定交换机“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)]

图解:

  • P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
  • X:Exchange(交换机),接收生产者的消息,然后把消息递交给与routing key完全匹配的队列。
  • C1:消费者,其所在队列指定了需要routing key 为error的消息。
  • C2:消费者,其所在队列指定了需要routing key 为 info、error、warning的消息。
  1. 开发生产者
		// 通过通道声明交换机channel.exchangeDeclare("logs_routing", "direct");// 发送消息String routingKey = "info";channel.basicPublish("logs_routing", routingKey, null, ("这是direct模型发布的基于route key:" + routingKey).getBytes());
  1. 开发消费者
        // 通道声明交换机以及交换的类型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)]

通配符
* (star) can substitute for exactly one word. 匹配一个单词
# (hash) can substitute for zero or more words. 匹配一个或多个单词如:
audit.# 匹配audit.irs.corporate 或者 audit.irs 等
audit.* 只能匹配audit.irs
  1. 生产者
		 // 声明交换机以及交换机类型channel.exchangeDeclare("topics", "topic");// 发布消息String routeKey = "user.delete";channel.basicPublish("topics", routeKey, null, ("这里是topic动态路由模型,route key:" + routeKey).getBytes());
  1. 消费者
		// 生命交换机以及交换机类型channel.exchangeDeclare("topics", "topic");// 创建一个临时队列String queueName = channel.queueDeclare().getQueue();// 绑定队列和交换机 动态通配符形式 route keychannel.queueBind(queueName, "topics", "use.*");	

案例结果

请添加图片描述

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

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

相关文章

在线五子棋对战

目录 数据管理模块(数据库设计) 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据管理模块(数据库设计) 数据库中有可能存在很多张表&#xf…

已注销【888】

元神密码 - 飞书云文档 (feishu.cn)

微信小程序接入腾讯云天御验证码

腾讯云新一代行为验证码(Captcha),基于十道安全防护策略,为网页、APP、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。 …

DataSphere Studio- 1.1.1 安装部署(自动化脚本)

DSSLinkis Ansible一键安装脚本 DSS1.1.1 & Linkis 1.3.0 Ansible 一键部署脚本 作者:wubolive Q Q:1049635685 邮箱:wubolivefoxmai.com Github:https://github.com/wubolive/dss-linkis-ansible 一、简介 为解决繁琐…

flutter开发实战-时间显示刚刚几分钟前几小时前

flutter开发实战-时间显示刚刚几分钟前几小时前 在开发中经常遇到从服务端获取的时间戳,需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 一、代码实现 static String timeFormatterChatTimeStamp(int seconds) {try {int nowDateSeconds (DateTi…

消息疯狂堆积!RocketMQ出Bug了?

前言 用过 MQ 的同学,可能会遇到过消息堆积的问题。而肥壕最近也踩上了这个坑,但是发现结果竟然是这么一个意料之外的原因而导致的。 正文 那一晚月黑风高,肥壕正准备踏上回家的路,突然收到告警短信轰炸!“MQ 消息堆…

微服务的基础使用

微服务 Maven的依赖冲突解决方案: 路径最短原则 配置优先原则 破坏规则则使用排除 SpringBoot场景启动器starter的开发流程 c3p0-spring-boot-starter自定义场景启动器 test-c3p0调用自定义场景启动器 SpringBoot自动装配 SpringBoot应用启动原理 nacos服务治…

nvm安装和使用

公司不同系统用的node版本不一样,所以就需要安装多版本了,那么使用nvm来管理就大大方便了开发。 使用nvm有哪些好处呢 安装node很方便,只需要一条命令可以轻松切换node版本可以多版本node并存 需要注意的是安装之前先把原有的node给卸载掉…

Mysql面试突击班索引,事务与锁

Mysql面试突击班索引,事务与锁 1.为什么Mysql要使用B树做为索引而不用B树 B树能显著减少IO次数,提高效率B树的查询效率更加稳定,因为数据放在叶子节点B树能提高范围查询的效率,因为叶子节点指向下一个叶子节点B树采取顺序读 2.…

一 关于idea如何在svn进行项目下载并运行成功

安装svn客户端 如图 安装时请选择该选项(Will be installed on local hard drive)并选择自己想要安装的目录路径 如图 svn安装成功 如图 注意 安装完成后,使用svn进行一次checkout的项目导出完成以上五步时&…

【火炬之光-召唤装备】

头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注*邪龙头冠无限要塞/血抗血抗血抗***终焉复临任意攻速单手武器/黑峡烬盾1召唤等级血抗*原点的寒冬1召唤等级1.刷钢铁炼境监视者-无垢之墙升级。2.不能用典狱官的胸针参考视频机械领主无限要塞––***终焉复临––求生之欲––参考视…

TikTok马来西亚站变动,指定物流服务商!

8月2日,据TechinAsia报道,TikTok已将百世快递在马来西亚的子公司BestExpressMalaysia,指定为其在马来西亚的物流服务商。目前,百世快递已在越南、泰国与TikTok展开类似合作。 合作后,百世马来子公司将为TikTokShop卖家…

通向架构师的道路之apache_tomcat_https应用

一、总结前一天的学习 通过上一章我们知道、了解并掌握了Web Server结合App Server是怎么样的一种架构,并且亲手通过Apache的Http Server与Tomcat6进行了整合的实验。 这样的架构的好处在于: 减轻App Server端的压力,用Web Server来分压…

Python-Python基础综合案例:数据可视化 - 折线图可视化

版本说明 当前版本号[20230729]。 版本修改说明20230729初版 目录 文章目录 版本说明目录知识总览图Python基础综合案例:数据可视化 - 折线图可视化json数据格式什么是jsonjson有什么用json格式数据转化Python数据和Json数据的相互转化 pyecharts模块介绍概况如何…

sqoop

一、bg 可以在关系型数据库和hdfs、hive、hbase之间导数 导入:从RDBMS到hdfs、hive、hbase 导出:相反 sqoop1 和sqoop2 (1.99.x)不兼容,sqoop2 并没有生产的稳定版本, Sqoop1 import原理(导入) 从传统数据库获取元数据信息&…

2023-08-03 LeetCode每日一题(删除注释)

2023-08-03每日一题 一、题目编号 722. 删除注释二、题目链接 点击跳转到题目位置 三、题目描述 给一个 C 程序,删除程序中的注释。这个程序source是一个数组,其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。 在 C 中有两种注释风…

Docker容器技术

目录 1.初识Docker 1.1 为什么使用docker 1.2 Docker技术 1.3.安装Docker 1.4.Docker架构 1.5.配置Docker镜像加速器 2.Docker常用命令 2.1.Docker服务相关的命令 2.2.Docker镜像相关的命令 2.3.Docker容器相关的命令 3. 容器的数据卷 3.1.数据卷的概念和作用 3.2.…

HET-1型多功能二维材料转移平台

HET-1型多功能二维材料转移平台 产品介绍 HET-1型二维转移平台适用于石墨烯、各类过渡金属化合物、黑磷等多种单层及其多层二维材料的精确定位转移及范德瓦尔斯异质结的准确制备,实现了低维材料转移的精确可视化操作。本套转移平台由转移台模块、样品台模块、显微观…

Oracle FETCH子句详解

目录 一、语法 二、oracle等同写法 三、Mysql等同写法 由于oracle不能使用limit,所以用fetch用来限制查询返回的行数。 一、语法 [ OFFSET offset ROWS] FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ] 说明: OFFSET…

移远通信首批加入“5G+eSIM计算终端产业合作计划”,助力大屏移动终端全时在线

7月29日,在全球数字娱乐产业盛会 ChinaJoy上,中国联通携手高通公司、GSMA发布了“5GeSIM 计算终端产业合作计划”。 作为全球领先的物联网整体解决方案供应商,移远通信首批加入该计划,副总经理刘明辉受邀参加5GeSIM 计算终端产业合…