【RabbitMQ】RabbitMQ 的 6 种工作模式

news2025/2/25 4:38:43

RabbitMQ 的 6 种工作模式

  • 1.简单模式
  • 2.工作队列模式
  • 3.交换机模式
  • 4.Routing 转发模式
  • 5.主题转发模式
  • 6.RPC 模式
    • 6.1 消息属性
    • 6.2 关联标识
    • 6.3 工作流程
  • 7.小结

1.简单模式

生产者把消息放入队列,消费者获得消息,如下图所示。这个模式只有 一个消费者一个生产者一个队列,只需要配置主机参数,其他参数使用默认值即可通信。
在这里插入图片描述

2.工作队列模式

这种模式出现了多个消费者,如下图所示。为了保证消费者之间的负载均衡和同步,需要在消息队列之间加上同步功能。
在这里插入图片描述
工作队列(任务队列)背后的主要思想是:避免立即执行资源密集型任务(耗时),以便下一个任务执行时不用等待它完成。工作队列将任务封装为消息并将其发送到队列中。

3.交换机模式

实际上,前两种模式也使用了交换机,只是使用了采用默认设置的交换机。交换机参数是可以配置的,如果消息配置的交换机参数和 RabbitMQ 队列绑定(binding)的交换机名称相同,则转发,否则丢弃,如下图所示。
在这里插入图片描述

4.Routing 转发模式

交换机要配置为 direct 类型,转发的规则变为检查队列的 routing key 值。如果 routing key 值相同,则转发,否则丢弃,如下图所示。
在这里插入图片描述

5.主题转发模式

这种模式下交换机要配置为 topic 类型,routing key 配置失效。发送到主题交换机的信息不能是任意 routing key,它必须是一个单词的列表,用逗号分隔。特点是可以模糊匹配,匹配规则为:* 可以代替一个词;# 可以代替 0 个或更多的单词,其模式情况如下图所示。
在这里插入图片描述

6.RPC 模式

6.1 消息属性

AMQP 协议给消息预定义了一系列的 14 个属性。大多数属性很少会用到,除了以下几个:

  • delivery_mode投递模式):将消息标记为持久的(值为 2 2 2)或暂存的(除了 2 2 2 之外的其他任何值)。
  • content_type内容类型):用来描述编码的 mime-type。例如在实际使用中常常使用 application/json 来描述 JOSN 编码类型。
  • reply_to回复目标):通常用来命名回调队列。
  • correlation_id关联标识):用来将 RPC 的响应和请求关联起来。

6.2 关联标识

如果给每一个 RPC 请求新建一个回调队列。这不是一个高效的做法,幸好这儿有一个更好的办法 —— 我们可以 为每个客户端只建立一个独立的回调队列

这就带来一个新问题,当此队列接收到一个响应的时候它无法辨别出这个响应是属于哪个请求的。correlation_id 就是为了解决这个问题而来的。我们给每个请求设置一个独一无二的值。稍后,当我们从回调队列中接收到一个消息的时候,我们就可以查看这条属性从而将响应和请求匹配起来。如果我们接手到的消息的 correlation_id 是未知的,那就直接销毁掉它,因为它不属于我们的任何一条请求。

你也许会问,为什么我们接收到未知消息的时候不抛出一个错误,而是要将它忽略掉?这是为了解决服务器端有可能发生的竞争情况。尽管可能性不大,但 RPC 服务器还是有可能在已将应答发送给我们但还未将确认消息发送给请求的情况下杀掉。如果这种情况发生,RPC 在重启后会重新处理请求。这就是为什么我们必须在客户端优雅的处理重复响应,同时 RPC 也需要尽可能保持幂等性。

6.3 工作流程

这种模式主要使用在远程调用的场景下。如果一个应用程序需要另外一个应用程序来最终返回运行结果,那这个过程可能是比较耗时的操作,使用 RPC 模式是最合适的。其模式情况如下图所示。
在这里插入图片描述

  • 当客户端启动的时候,它创建一个匿名独享的回调队列。
  • 在 RPC 请求中,客户端发送带有两个属性的消息:一个是设置回调队列的 reply_to 属性,另一个是设置唯一值的 correlation_id 属性。
  • 将请求发送到一个 rpc_queue 队列中。
  • RPC 工作者(又名:服务器)等待请求发送到这个队列中来。当请求出现的时候,它执行他的工作并且将带有执行结果的消息发送给 reply_to 字段指定的队列。
  • 客户端等待回调队列里的数据。当有消息出现的时候,它会检查 correlation_id 属性。如果此属性的值与请求匹配,将它返回给应用。

7.小结

6 种工作模式的主要特点如下

  • 简单模式:只有一个生产者,一个消费者。
  • 工作队列模式:一个生产者,多个消费者,每个消费者获取到的消息唯一。
  • 订阅模式:一个生产者发送的消息会被多个消费者获取。
  • 路由模式:发送消息到交换机,并且要指定路由 key,消费者在将队列绑定到交换机时需要指定路由 key
  • Topic 模式:根据主题进行匹配,此时队列需要绑定在一个模式上,# 匹配一个词或多个词,* 只匹配一个词。

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

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

相关文章

【python】python指南(三):使用正则表达式re提取文本中的http链接

一、引言 对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言,实习的时候做一个算法策略后台用的是php,毕业后做策略算法开发,因为要用spark&#x…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论:1、全部都为大写;2、全部都为小写;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

Python基础教程(十五):面向对象编程

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

【机器学习】Dify:AI智能体开发平台版本升级

一、引言 关于dify,之前力推过,大家可以跳转 AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署了解,今天主要以dify为例,分享一下如何进行版本升级。 二、版本升级 2.1 原方案 #首次…

超图制作栅格数据集专题图示例

之前写过一两篇专题图的博文,是制作的矢量数据集的专题图; 有一个栅格数据集如下,不知是干嘛的,可能是一个地形,或水系; 看一下对栅格数据集制作专题图;能制作的专题图类型少些, 先…

pytorch学习笔记7

getitem在进行索引取值的时候自动调用,也是一个魔法方法,就像列表索引取值那样,一个意思 import torchvision from torch.utils.data import DataLoaderdata_transformtorchvision.transforms.Compose([torchvision.transforms.ToTensor()] ) test_datatorchvision.datasets.C…

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA,需要先按照Graphql插件,步骤如下: (1)打开插件管理 在IDEA中,打开主菜单,选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …

【测试】软件测试方案—实际项目直接套用(Word原件)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

宝藏速成秘籍(5)插入排序法

一、前言 1.1、概念 插入排序(Insertion Sort)是一种简单直观的排序算法,其工作原理类似于人们整理一手扑克牌。插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入…

Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)

Servlet技术(Servlet,ServletConfig,ServletContext) 1.Servlet的概述 Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写。与Java程序的区别是,Servlet 对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器(Tomcat)的…

MySQL与PostgreSQL关键对比四(关联查询性能)

引言:MySQL单表的数据规模一般建议在百万级别,而PostgreSQL的单表级别一般可以到亿级,如果是MPP版本就会更多。从基础数据建议上,不难看出,MySQL在Join的情况下也就是主要查询的情况下性能和PostgreSQL相差还是很大的。…

Navicat和SQLynx产品功能比较一(整体比较)

Navicat和SQLynx都是数据库管理工具,在过去的二十年中,国内用户主要是使用Navicat偏多,一般是个人简单开发需要,数据量一般不大,开发相对简单。SQLynx是最近几年的数据库管理工具,Web开发,桌面版…

【odoo】odoo中对子数据的独有操作[(0, 0, {‘name‘: ‘demo‘})]

概要 在Odoo中,有种写法用于操作 one2many 或 many2many 字段时,描述如何在数据库中创建、更新或删除相关记录。具体而言,这是一种命令格式,被称为 "commands" 或 "special command tuples",用于 …

高考志愿填报,大学读什么专业比较好?

高考分数出炉后,选择什么样的专业,如何去选择专业?于毕业生而言是一个难题。因为,就读的专业前景不好,意味着就业情况不乐观,意味着毕业就是失业。 盲目选择专业的确会让自己就业时受挫,也因此…

服务器数据恢复—OceanStor存储中NAS卷数据丢失如何恢复数据?

服务器存储数据恢复环境&故障: 华为OceanStor某型号存储。工作人员在上传数据时发现该存储上一个NAS卷数据丢失,管理员随即关闭系统应用,停止上传数据。这个丢失数据的卷中主要数据类型为office文件、PDF文档、图片文件(JPG、…

Hbase搭建教程

Hbase搭建教程 期待您的关注 ☀小白的Hbase学习笔记 目录 Hbase搭建教程 1.上传hbase的jar包并解压 2.重新登录 3.启动zookeeper 4.配置环境变量 5.关闭ZK的默认配置 6.修改hbase-site.xml文件 7.修改regionservers文件 8.将配置好的文件分发给其它节点 9.配置环境变量…

Vue34-销毁流程

一、销毁流程预览 二、vm.$destroy()函数的调用,开始销毁流程 一个应用只有一个vm,但是一个vm会管理一堆组件实例对象(和vm很像:微型的vm)。 销毁流程中解绑的事件监听器,是自定义事件,不是原…

大白菜PE系统进入时一直 ACPI_BIOS_ERROR

安装系统PE不支持,主板不兼容,换个WIN10的PE就解决了,跟之前部分电脑需要WIN8的PE同理 WIN10PE教程 WIN8PE教程

面试题:Redis是什么?有什么作用?怎么测试?

有些测试朋友来问我,redis要怎么测试?首先我们需要知道,redis是什么?它能做什么? redis是一个key-value类型的高速存储数据库。 redis常被用做:缓存、队列、发布订阅等。 所以,“redis要怎么测试…

AI时代新爬虫:网站自动转LLM数据,firecrawl深度玩法解读

在大模型的时代,爬虫技术也有了很多新的发展,最近出现了专门针对大模型来提取网站信息的爬虫,一键将网页内容转换为LLM-ready的数据。今天我们介绍其中的开源热门代表:firecrawl。 firecrawl 是什么 FireCrawl是一款创新的爬虫工…