当前位置: 首页 > news >正文

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", 消息内容);

五种工作模式:全面解读

相关文章:

RabbitMQ的 五种工作模型

RabbitMQ 其实一共有六种工作模式: 简单模式(Simple)、工作队列模式(Work Queue)、 发布订阅模式(Publish/Subscribe)、路由模式(Routing)、通配符模式(Topi…...

原型制作神器ProtoPie的使用Unity与网页跨端交互

什么是ProtoPie? ProtoPie是一款面向设计师的软件原型设计工具,例如制作App界面交互展示,制作好的原型可以一键发布到Web服务器,就可以浏览器访问。由于其内置了大量常用交互类型,以及"程序化"模块&#xf…...

另辟奚径-Android Studio调用Delphi窗体

大家都知道Delphi能调用安卓SDK,比如jar、aar等, 但是反过来,能在Android Studio中调用Delphi开发的窗体吗? 想想不太可能吧, Delphi用的是Pascal,Android Studio用的是Java,这两个怎么能混用…...

SOLID 原则,程序设计五大原则,设计模式

SOLID 是让软件设计更易于理解、更加灵活和更易于维护的五个原则的简称。 单一职责(Single Responsibility Principle):修改一个类的原因只能有一个。开闭原则(Open/Closed Principle):对于扩展,类应该是“开放”的;对于修改&…...

Java基础——数组(一维数组与二维数组)

文章目录 一维数组声明初始化与赋值内存图解 二维数组声明初始化与赋值内存图解 数组练习 数组是多个相同类型的数据按一定顺序排列的集合。 说明: 数组是引用数据类型,数组的元素是同一类型的任何数据类型,包括基本数据类型和引用数据类型…...

Python爬虫抓取微博数据及热度预测

首先我们需要安装 requests 和 BeautifulSoup 库,可以使用以下命令进行安装: pip install requests pip install beautifulsoup4然后,我们需要导入 requests 和 BeautifulSoup 库: import requests from bs4 import BeautifulSou…...

Qt QTableWidget表格的宽度

默认值 QTableWIdget的表格宽度默认是一个给定值,可以手动调整每列的宽度,也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{"11","111111111111",&…...

OpenCV(opencv_apps)在ROS中的视频图像的应用(重点讲解哈里斯角点的检测)

1、引言 通过opencv_apps,你可以在ROS中以最简单的方式运行OpenCV提供的许多功能,也就是说,运行一个与功能相对应的launch启动文件,就可以跳过为OpenCV的许多功能编写OpenCV应用程序代码,非常的方便。 对于想熟悉每个…...

常见排序算法之插入排序类

插入排序,是一种简单直观的排序算法,工作原理是将一个记录插入到已经排好序的有序表中,从而形成一个新的、记录数增1的有序表。在实现过程中,它使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循…...

Dubbo服务消费端远程调用过程剖析

1 Dubbo服务消费端远程调用过程概述 (1)当消费方调用远程服务的方法时,会被InvokerInvocationHandler拦截,执行其invoke()方法,创建RpcInvocation对象; (2)接着会选择远程调用的负…...

华硕荣获“EPEAT Climate+ Champion”永续先驱称号

华硕持续深耕永续理念,努力提供低碳排放、高效能产品,并被全球电子委员会授予“EPEAT Climate Champion”称号。这一荣誉再次表明了华硕在永续管理方面的承诺,并凸显了华硕在追求永续发展上的决心。 华硕通过设立“科学基础减碳目标”、“再生…...

基于QT使用OpenGL,加载obj模型,进行鼠标交互

目录 功能分析(需求分析)技术点分析OpenGL立即渲染模式可编程渲染管线模式 QOpenGLWidget派生类 glwidget逻辑glwidget.hglwidget.cpp 鼠标交互功能obj格式介绍 效果bunnyCayman_GT 功能分析(需求分析) 基于QT平台,使…...

三大赛题指南发布!2023 冬季波卡黑客松本周末开启 Workshop

2023 年一众黑客松赛事中,为什么我们建议您选择波卡黑客松大赛?或许答案在于——作为开发者极度友好的技术生态,波卡能够从参赛者的立场出发,为大家提供从 0 到 1 实现项目孵化成长的机会。这里聚集了一线技术专家的资源力量&…...

数据结构与算法(Java版) | 算法的空间复杂度简介

关于算法的空间复杂度,下面我给大家作一个简单介绍。 类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,同样,它也是问题规模n的一个函数。 其实&#xff0c…...

大数据-之LibrA数据库系统告警处理(ALM-12037 NTP服务器异常)

告警解释 当NTP服务器异常时产生该告警。 当NTP服务器异常消除时,该告警恢复。 告警属性 告警ID 告警级别 可自动清除 12037 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称。 RoleName 产生告警的角色名称。 HostName 异常N…...

烟草5G智慧工厂数字孪生可视化平台,赋能烟草工业数字化智慧转型

随着卷烟工厂提质增效需求增强,信息化建设推进及生产制造系统智能化改革发展,各生产单元逐步升级完善数字化,最终实现智能制造成为必然趋势。因此,5G卷烟加工工厂的数字化转型迫在眉睫。中国烟草制造行业正迈向全新的市场经济时代…...

PHP编写采集药品官方数据的程序

在 PHP 中编写爬虫程序,首先我们需要引入一些必要的库,如 curl 和 file_get_contents。然后,我们需要设置爬虫ip信息,以便我们可以从指定的爬虫ip服务器上获取数据。 // 引入必要的库 require_once curl.php;// 设置爬虫ip信息 $p…...

解决Jenkins执行git脚本时报错:No such device or address问题

问题现象: Jenkins执行BeanShell脚本时,报错:jenkins fatal: could not read Username for http://112.11.120.1: No such device or address 解决方案: 解决服务器拉取git仓库的代码权限,使用高级子模块克隆功能。…...

LCD英文字模库(16x8)模拟测试程序

字模 字模,就是把文字符号转换为LCD能识别的像素点阵信息。 电子发烧友可能都熟悉字模的用途。就是调用者通过向LCD模块发送字模数据,LCD根据字模数据在LCD面板上相应的像素描绘出图形或文字。 现在,大部分的LCD都内置了字模库&#xff0c…...

二分法

文章目录 二分法概述二分 > value最左的位置二分 < value最右的位置局部最小值问题 二分法概述 什么是二分法呢&#xff1f;相信大家都有所了解&#xff0c;举个最经典的二分的例子。 ​ 给定一个整型有序数组&#xff0c;和一个值 v a l u e value value&#xff0c;如…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...