【RabbitMQ】RabbitMQ 的七种工作模式介绍

news2024/11/25 11:24:33

目录

1. Simple(简单模式)

2. Work Queue(工作队列)

3. Publish/Subscribe(发布/订阅)

4. Routing(路由模式)

5. Topics(通配符模式)

6. RPC(RPC通信)

7. Publisher Confirms(发布确认)


上一篇文章中我们简单认识了RabbitM1: 

【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码_rabbitmq 编程-CSDN博客

RabbitMQ 共提供了7种工作模式, 进行消息传递, 我们上一篇文章入门程序的案例, 其实就是一个简单模式.

官方文档:https://www.rabbitmq.com/tutorials

1. Simple(简单模式)

P: 生产者, 也就是要发送消息的程序
C: 消费者, 消息的接收者
Queue: 消息队列, 图中黄色背景部分. 类似一个邮箱, 可以缓存消息; 生产者向其中投递消息, 消费者从其中取出消息

特点: 一个生产者P,一个消费者C, 消息只能被消费一次, 也称为点对点(Point-to-Point)模式
适用场景: 消息只能被单个消费者处理

2. Work Queue(工作队列)

一个生产者P,多个消费者C1, C2. 在多个消息的情况下, Work Oueue 会将消息分派给不同的消费者, 每个消费者都会接收到不同的消息.

特点: 消息不会重复, 分配给不同的消费者

适用场景: 集群环境中做异步处理

比如12306 短信通知服务, 订票成功后, 订单消息会发送到RabbitMO, 短信服务从RabbitMO中获取订单信息, 并发送通知信息(在短信服务之间进行任务分配)

3. Publish/Subscribe(发布/订阅)

图中X表示交换机, 在订阅模型中,多了一个Exchange角色, 过程略有变化

概念介绍
Exchange: 交换机(X).
作用: 生产者将消息发送到Exchange,由交换机将消息按一定规则路由到一个或多个队列中(上图中生产者将消息投递到队列中,实际上这个在RabbitMO中不会发生.

RabbitMO交换机有四种类型:fanout, direct, topic, headers, 不同类型有着不同的路由策略. AMOP协议里还有另外两种类型, System和自定义, 此处不再描述.

1. Fanout: 广播,将消息交给所有绑定到交换机的队列(Publish/Subscribe模式)
2. Direct: 定向,把消息交给符合指定routing key的队列(Routing模式)
3. Topic: 通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)
4. headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的
headers属性进行匹配. headers类型的交换器性能会很差, 而且也不实用, 基本上不会看到它的存在
Exchange(交换机)只负责转发消息, 不具备存储消息的能力, 因此如果没有任何队列与Exchange绑
定,或者没有符合路由规则的队列,那么消息就会丢失. 

RoutingKey: 路由键, 生产者将消息发给交换器时, 指定的一个字符串, 用来告诉交换机应该如何处理这个消息.

Binding Key: 绑定. RabbitMQ中通过Binding (绑定) 将交换器与队列关联起来, 在绑定的时候一般会指定一个Binding Key, 这样RabbitMQ就知道如何正确地将消息路由到队列了,

比如下图: 如果在发送消息时, 设置了RoutingKey为orange, 消息就会路由到Q1

当消息的Routingkey与队列绑定的Bindingkey相匹配时,消息才会被路由到这个队列

BindingKey 其实也属于路由键中的一种, 官方解释为: the routingkey to use for the binding.

可以翻译为: 在绑定的时候使用的路由键, 大多数时候, 包括官方文档和RabbitMOJava API 中都把
BindingKey和RoutingKey看作RoutingKey, 为了避免混淆, 可以这么理解:

1. 在使用绑定的时候, 需要的路由键是BindingKey.
2. 在发送消息的时候, 需要的路由键是RoutingKey.
 

Publish/Subscribe模式

一个生产者P, 多个消费者C1, C2, X代表交换机消息复制多份,每个消费者接收相同的消息

生产者发送一条消息,经过交换机转发到多个不同的队列,多个不同的队列就有多个不同的消费者

适合场景: 消息需要被多个消费者同时接收的场景. 如: 实时通知或者广播消息

比如中国气象局发布"天气预报"的消息送入交换机, 新浪, 百度, 搜狐, 网易等门户网站接入消息,通过队列绑定到该交换机, 自动获取气象局推送的气象数据

4. Routing(路由模式)

路由模式是发布订阅模式的变种, 在发布订阅基础上, 增加路由key

发布订阅模式是无条件的将所有消息分发给所有消费者, 路由模式是Exchange根据RoutingKey的规则, 将数据筛选后发给对应的消费者队列

适合场景: 需要根据特定规则分发消息的场景

比如系统打印日志, 日志等级分为error, warning, info, debug, 就可以通过这种模式, 把不同的日志发送到不同的队列, 最终输出到不同的文件

5. Topics(通配符模式)

路由模式的升级版, 在routingKey的基础上, 增加了通配符的功能, 使之更加灵活

Topics和Routing的基本原理相同,即: 生产者将消息发给交换机,交换机根据RoutingKey将消息转
发给与RoutingKey匹配的队列. 类似于正则表达式的方式来定义Routingkey的模式

不同之处是: routingKey的匹配方式不同,Routing模式是相等匹配,topics模式是通配符匹配

适合场景: 需要灵活匹配和过滤消息的场景

6. RPC(RPC通信)

在RPC通信的过程中, 没有生产者和消费者, 比较像咱们RPC远程调用, 大概就是通过两个队列实现了一个可回调的过程

1. 客户端发送消息到一个指定的队列, 并在消息属性中设置replyTo字段, 这个字段指定了一个回调队列, 用于接收服务端的响应.

2. 服务端接收到请求后,处理请求并发送响应消息到replyTo指定的回调队列

3. 客户端在回调队列上等待响应消息.一旦收到响应,客户端会检查消息的correlationld属性,以
确保它是所期望的响应,

7. Publisher Confirms(发布确认)

Publisher Confirms模式是RabbitMQ提供的一种确保消息可靠发送到RabbitMQ服务器的机制。在这种模式下,生产者可以等待RabbitMO服务器的确认,以确保消息已经被服务器接收并处理

1.生产者将Channel设置为confirm模式(通过调用channel.confirmSelect()完成)后, 发布的每一条消
息都会获得一个唯一的ID, 生产者可以将这些序列号与消息关联起来,以便跟踪消息的状态

2.当消息被RabbitMO服务器接收并处理后,服务器会异步地向生产者发送一个确认(ACK)给生产者
(包含消息的唯一ID),表明消息已经送达,

通过Publisher Confirms模式,生产者可以确保消息被RabbitMQ服务器成功接收,从而避免消息丢失的问题.

适用场景: 对数据安全性要求较高的场景. 比如金融交易, 订单处理

 

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

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

相关文章

【Qt】窗口关闭提示框

在关闭QWdiget窗口时弹出提示框 重写**closeEvent**函数 void closeEvent(QCloseEvent* event) override;QMessageBox *msgBox new QMessageBox(QMessageBox::Question, "信息提示", "是否保存当前数据?", QMessageBox::Save | QMessageBox::N…

github克隆项目中的子模块submodule时遇到“无法访问远程仓库,请检查权限“

问题描述 在拉取仓库的时候发现了新东西。 仓库中有两个文件夹提示 点击之后,发现跳转到了另一个仓库 ,原来这是仓库的子模块,第一次见,也就是仓库中包含了其他的的仓库,就是这么简单的原理。 但是在拉取仓库以后发现…

VScode环境配置

目录 好用插件推荐 1.Auto Rename Tag 2.openbrowser 3.实时预览(推荐) VSCode常用的快捷键 1. 快速复制一行 2.快速复制一行代码选定多个相同的单词 3. 添加多个光标 4. 全局替换某写单词 5. 快速定位到某一行 6. 选择某个区块 7. 放大缩…

高一全栈开发;国产 Arc 浏览器;Tauri 2.0 发布 | 生活周刊 #3

发现新应用 Vectorcraftr Vectorcraftr 提供免费可商用的插画库,风格有很多,自行食用 书立 一款功能强大、特性丰富的笔记软件,包含富文本,双链,表格,富目录树,WebDAV ,自由导出等…

WPF 为button动态设置不同的模板

有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容,比如Button未点击安装显示: 安装后显示: 可以通过设置button的content,通过content来设置不同的模板来实现功能,以下是代码: MainWi…

【消息队列】Kafka从入门到面试学习总结

国科大学习生活(期末复习资料、课程大作业解析、大厂实习经验心得等): 文章专栏(点击跳转) 大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转&…

CentOS7安装Gitlab服务

文章目录 前言一、安装依赖二、安装gitlab1、上传安装2、修改配置 三、启动gitlab服务四、修改密码五、设置为中文(低版本有问题)六、常用命令 前言 文中gitlab版本为: gitlab-ce-14.2.7 一、安装依赖 gitlab需要安装如下依赖,否…

Linux编辑器-vim的配置及其使用

vim是一种多模式的编辑器: 1.命令模式(默认模式):用户所有的输入都会当作命令,不会当作文本输入。 2.插入模式:写代码, 按「 i 」切换进入插入模式「 insert mode 」,按 “i” 进入…

2024/10/13周报

文章目录 摘要Abstract文献阅读题目1. 背景与问题提出2. 提出的CLATT方法2.1 卷积神经网络(CNN)2.2 长短期记忆网络(LSTM)2.3 注意力机制2.4 滑动窗口方法 3. 实验设计与结果3.1 数据集3.2 实验基线与评价指标3.3 实验结果与分析 …

使用清华大学开源软件镜像站下载JDK

在软件开发和日常使用中,Java Development Kit(JDK)是不可或缺的一部分。它提供了Java运行环境和开发工具,使得开发者可以编写、编译和运行Java应用程序。本文将指导你如何从清华大学开源软件镜像站(TUNA)下…

通信工程学习:什么是UART通用异步收发器

UART:通用异步收发器 UART,全称Universal Asynchronous Receiver/Transmitter,即通用异步收发传输器,是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。以下是关于UART的详细介绍: 一、定义与特点 定义&…

数据分析:R语言计算XGBoost二分类模型的SHAP值

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据建模平均SHAP值计算单个样本的每个特征的SHAP值蜜蜂图依赖图单个样本的SHAP解释(Force Plot)其他方法计算SHAP值单个个体预测结果系统信息…

MLM之Llama-3:Llama 3.2的简介、安装和使用方法、案例应用之详细攻略

MLM之Llama-3:Llama 3.2的简介、安装和使用方法、案例应用之详细攻略 目录 Llama 3.2 简介 1、Llama 3.2 的特点 2、模型评估 轻量级指令调优基准 视觉指令调整基准 Llama 3.2 的安装和使用方法 1、下载模型 2. 开发环境准备 3. 使用模型进行推理和微调 4…

Ubuntu命令行快速部署C++语言的GDAL库

本文介绍在Linux系统的Ubuntu电脑中,在命令行中一句代码快速配置C 环境下的gdal库的方法。 在文章Ubuntu基于Docker快速配置GDAL的Python、C环境(https://blog.csdn.net/zhebushibiaoshifu/article/details/133433838)中,我们就介…

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…

施磊C++ | 进阶学习笔记 | 3.绑定器和函数对象、lambda表达式

三、绑定器和函数对象、lambda表达式 文章目录 三、绑定器和函数对象、lambda表达式3.1模板的完全特例化和非完全(部分)特例化1.完全特例化和非完全(部分)特例化2.模板的实参推演 3.2 C STL中的绑定器bind1stbind2nd自己实现一个b…

深度学习——线性神经网络(三、线性回归的简洁实现)

目录 3.1 生成数据集3.2 读取数据集3.3 定义模型3.4 初始化模型参数3.5 定义损失函数3.6 定义优化算法3.7 训练 在上一节中,我们通过张量来自定义式地进行数据存储和线性代数运算,并通过自动微分来计算梯度。实际上,由于数据迭代器、损失函数…

基于深度学习的西红柿成熟度检测系统

简介: 基于深度学习技术的西红柿成熟度检测系统是一种利用人工智能算法对西红柿成熟程度进行自动识别和分类的智能系统。该系统通过采集西红柿的图像数据,运用深度学习模型对图像中的西红柿进行特征提取和分析,从而实现对西红柿成熟度的准确判…

【C】printf()与scanf()详介以及如何在VS中使用scanf(保姆级详细版)

printf() 基本用法 printf()的作用是将参数文本输出到屏幕,它名字里面的f 代表 format(格式化)&#xff0c;表示可以定制输出文本的格式。 1 #include <stdio.h>//standard input output标准输入输出操作 2 int main() 3{ 4 printf("Hello World"); 5 retu…

DVWA CSRF 漏洞实践报告

1. 漏洞简介 CSRF&#xff08;跨站请求伪造&#xff09;是一种攻击&#xff0c;使得攻击者能够以受害者的身份执行非预期的操作。在靶场DVWA中&#xff0c;我将尝试通过CSRF漏洞更改管理员密码。 2. 实验环境 DVWA版本&#xff1a;DVWA-old浏览器&#xff1a;火狐默认管理员账…