RabbitMQ的 五种工作模型

RabbitMQ 其实一共有六种工作模式:

简单模式(Simple)、工作队列模式(Work Queue)、
发布订阅模式(Publish/Subscribe)、路由模式(Routing)、通配符模式(Topic)、
远程调用模式(RPC)。其中发布订阅模式、路由模式、通配符模式这三种模型都属于订阅模式,只不过它们之间进行路由的方式不同罢了。
远程调用模式是RPC不属于MQ,所以最终统计下来就是五种工作模式。

总结:简单模式和工作队列模式,主要是【队列】和【消费者】的关系,一对一、一对多。
订阅模式包含:【交换机】和【队列】的关系,【队列】和【消费者】的关系。

队列和消费者是1对多时,那么就是采用平均的方式分给多个消费。队列里面的消息只有一个消费者会拿到。

一、简单模式(Simple)

在这里插入图片描述
【队列】和【消费者】

二、工作队列模式

在这里插入图片描述

工作队列模式(Work Queue)多了一些消费者,该模式也使用direct交换机,应用于处理消息较多的情况。特点: 一个队列对应多个消费者,通过队列进行消息传递 一条消息只会被一个消费者消费, 
消息队列默认采用轮询的方式将消息平均发送给消费者,使用Rabbitmq默认交换机direct 应用场景: 对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
缺点:因为消息是轮询平均发送给消费者。可能会有某个消费者Slow;
因为要处理其他复杂的业务逻辑,其消费的效率相对其他消费者比较慢,这个就会造成当其他消费者已经消费完处于空闲状态。
因平均分配原则,队列任会继续把消息发给 Slow 处于忙碌状态,大大降低了系统的性能。正确的做法的是“能劳者多劳;消费越快的,让其消费的越多”

三、发布订阅模式、路由模式、通配符模式

他们三个都属于订阅模型,订阅模型的共同点: 生产者,一个交换机(fanoutExchange),多个队列,多个消费者。
生产者将消息不是直接发送到队列,而是发送到X交换机,然后由交换机发送给多个队列,多个消费者分别各自监听一个队列,来消费消息。

交换机有哪些类型: 
1Fanout:广播,将消息交给所有绑定到交换机的队列 
2Direct:定向,把消息交给符合指定routing key 的队列 
3Topic:通配符是最为常有用的一种,交换机把消息交给符合routing pattern(路由模式)的队列 

应用场景:电商网站的同一条促销信息需要短信发送、邮件发送、站内信发送等。此时可以使用发布订阅模式(Publish/Subscribe)

一、发布订阅模式

在这里插入图片描述

生产者将消息发送给交换机,交换机将消息转发到绑定此交换机的每个队列中,注意是【同一个消息】会转给【所有的队列】。
这里还只是【交换机和队列的关系】,交换机会把一个消息给所有的队列,
但是一个队列,如果绑定多个消费者,那么这个队列,就会采用平均的方式分给消费者。前面的【工作队列模式】的交换机只能将消息发送给【一个队列】,
而【发布订阅模式】的【交换机】能将【同一个消息】发送给【多个队列】。
注意是多个队列,而且交换机丢给队列的时候,也是采用【轮训】队列的方式,将消息丢给每个队列,发布订阅模式使用fanout交换机。总结:
订阅模式中,多个消费者同时订阅一个队列,该队列会【轮询】地把消息平均分配给每个消费者,这也就是标准的【工作队列模式】的模型。
通过前面的demo工程可知,我们在使用发布订阅模式时,所有消息都会发送到绑定的队列中。但很多时候,不是所有消息都【无差别】的发布到所有队列中,因为有的队列处理快有的队列处理慢,这无形当中就会照成不必要的资源浪费。
为了解决这个问题,路由模式就诞生了。

二、路由模式(Routing)

在这里插入图片描述

路由(Routing)模式是发布订阅模式的升级版。
我们知道发布订阅模式是【无条件】地将所有消息分发给【所有消费者队列】,每个队列中都有相同的消息;
路由模式,由上图很容易理解,每个队列消息会因为绑定的路由不同而不同。 特点:
1、每个队列绑定一个路由关键字RoutingKey,生产者将带有RoutingKey的消息发送给交换机,交换机再根据路由 RoutingKey关键字将消息定向发送到指定的队列中;
2、默认使用 direct 交换机。
代码:// 1、建立交换机
exchangeDeclare("exchange_topic", BuiltinExchangeType.TOPIC);// 2、创建队列
queueDeclare("queue1"...);
queueDeclare("queue2"...);
queueDeclare("queue3"...);// 3、交换机+队列+routeKey绑定关系
queueBind("queue1", "routeKey1", 交换机);
queueBind("queue2", "routeKey2", 交换机);
queueBind("queue3", "routeKey3", 交换机);// 6、发送消息,基于routeKey来发
basicPublish("routeKey1", 消息内容1);
basicPublish("routeKey2", 消息内容2);路由模式是一种精准的匹配,只有设置了 Routing Key 后消息才能进行分发。
但是,我们在实际的工作中开发需求时还有一些非常模糊的情况,比如消费者存在某种交集的联系只要符合某一个条件,
就需要有消息分发获取消息处理业务逻辑。这时候就需要用到“通配符模式“。

三、通配符模式(Topic)

在这里插入图片描述

通配符模式(Topic)是在路由模式的基础上升级,给队列绑定带通配符的路由关键字,
只要消息的RoutingKey能实现通配符匹配而不再是固定的字符串,就会将消息转发到该队列。通配符模式比路由模式更灵活。 特点:
1、消息设置RoutingKey时,RoutingKey由多个单词构成,中间以 . 分割。
2、队列设置RoutingKey时,#可以匹配任意多个单词,*可以匹配任意一个单词。
3、使用 topic 交换机。

代码:

// 1、建立交换机
exchangeDeclare("exchange_topic", BuiltinExchangeType.TOPIC);// 2、创建队列
queueDeclare("queue1"...);
queueDeclare("queue2"...);
queueDeclare("queue3"...);// 3、交换机+队列+routeKey绑定关系
queueBind("queue1", "#.big.#", 交换机);
queueBind("queue2", "#.middle.#", 交换机);
queueBind("queue3", "#.small.#", 交换机);// 6、发送消息,基于routeKey来发
channel.basicPublish("big.middle", 消息内容);
channel.basicPublish("small", 消息内容);

五种工作模式:全面解读

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

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

相关文章

高频SQL50题(基础版)-3

文章目录 主要内容一.SQL练习题1.1174-即时食物配送代码如下(示例): 2.550-游戏玩法分析代码如下(示例): 3.2356-每位教师所教授的科目种类的数量代码如下(示例): 4.1141-查询近30天活跃用户数代码如下&…

Python文件、文件夹操作汇总

目录 一、概览 二、文件操作 2.1 文件的打开、关闭 2.2 文件级操作 2.3 文件内容的操作 三、文件夹操作 四、常用技巧 五、常见使用场景 5.1 查找指定类型文件 5.2 查找指定名称的文件 5.3 查找指定名称的文件夹 5.4 指定路径查找包含指定内容的文件 一、概览 ​在…

照片放大软件 Topaz Gigapixel AI mac中文版简介

Topaz Gigapixel AI mac是一款使用人工智能功能扩展图像的桌面应用程序,同时添加自然细节以获得惊人的效果。使用深度学习技术,A.I.Gigapixel™可以放大图像并填写其他调整大小的产品遗漏的细节,使用A.I.Gigapixel™,您可以裁剪照…

LeetCode 面试题 16.20. T9键盘

文章目录 一、题目二、C# 题解 一、题目 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射…

Xilinx FPGA平台DDR3设计详解(一):DDR SDRAM系统框架

DDR SDRAM(双倍速率同步动态随机存储器)是一种内存技术,它可以在时钟信号的上升沿和下降沿都传输数据,从而提高数据传输的速率。DDR SDRAM已经发展了多代,包括DDR、DDR2、DDR3、DDR4和DDR5,每一代都有不同的…

【Unity之UI编程】编写一个面板交互界面需要注意的细节

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

LeetCode146.LRU缓存

写了一个小时,终于把示例跑过了,没想到啊提交之后第19/22个测试用例没过 我把测试用例的输出复制在word上看看和我的有什么不同,没想到有18页的word,然后我一直检查终于找出了问题,而且这个bug真的太活该了&#xff0c…

YOLOv5算法进阶改进(1)— 改进数据增强方式 + 添加CBAM注意力机制

前言:Hello大家好,我是小哥谈。本节课设计了一种基于改进YOLOv5的目标检测算法。首先在数据增强方面使用Mosaic-9方法来对训练集进行数据增强,使得网络具有更好的泛化能力,从而更好适用于应用场景。而后,为了更进一步提升检测精度,在backbone中嵌入了CBAM注意力机制模块,…

javaEE案例,前后端交互,计算机和用户登录

加法计算机,前端的代码如下 : 浏览器访问的效果如图 : 后端的代码如下 再在浏览器进行输入点击相加,就能获得结果 开发中程序报错,如何定位问题 1.先定位前端还是后端(通过日志分析) 1)前端 : F12 看控制台 2)后端 : 接口,控制台日志 举个例子: 如果出现了错误,我们就在后端…

devops完整搭建教程(gitlab、jenkins、harbor、docker)

devops完整搭建教程(gitlab、jenkins、harbor、docker) 文章目录 devops完整搭建教程(gitlab、jenkins、harbor、docker)1.简介:2.工作流程:3.优缺点4.环境说明5.部署前准备工作5.1.所有主机永久关闭防火墙…

mysql基础 --子查询

文章目录 子查询子查询案例 子查询 一个查询语句,嵌套在另一个查询语句内部;子查询先执行,其结果被外层主查询使用;子查询放入括号内;子查询放在比较条件的右侧;子查询返回一条,为单行子查询(对…

【云备份|| 日志 day6】文件业务处理模块

云备份day6 业务处理 业务处理 云备份项目中 ,业务处理模块是针对客户端的业务请求进行处理,并最终给与响应。而整个过程中包含以下要实现的功能: 借助网络通信模块httplib库搭建http服务器与客户端进行网络通信针对收到的请求进行对应的业…