RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
RabbitMQ 是一个消息代理系统,使用交换机(Exchange)、队列(Queue)和路由键(Routing Key)来管理消息的传递。它们分别起到不同的作用,构成了消息从生产者到消费者的传递路径。
以下是详细的解释:
1. 交换机(Exchange)
作用:
交换机负责接收来自生产者的消息,并根据一定的路由规则将消息分发给一个或多个队列。它是生产者和队列之间的中间层,生产者永远不会直接将消息发送到队列,而是通过交换机。
种类:
RabbitMQ 中有几种类型的交换机,每种交换机的消息路由行为都不同:
- Direct(直连交换机):根据精确匹配路由键(Routing Key)来将消息转发到绑定了相同路由键的队列。
- Fanout(扇出交换机):不处理路由键,直接将消息广播给绑定到该交换机的所有队列。类似广播机制。
- Topic(主题交换机):根据路由键的模式匹配(可以使用通配符)将消息路由到符合条件的队列。
- Headers(头交换机):根据消息的 headers(头部信息)属性来路由,而不是使用路由键。
作用场景:
交换机的主要作用是 决定消息应该被发送到哪些队列,每种交换机的类型决定了消息的路由逻辑。
2. 队列(Queue)
作用:
队列是消息的实际存储位置。消息被发送到队列后,消费者从队列中取出并处理。队列中的消息按照 先进先出(FIFO) 的顺序被消费者处理。
- 队列是点对点通信的终点,消费者从队列中拉取消息并处理,每个消息只会被一个消费者处理(除非有特别的广播机制)。
- 消息可以在队列中持久化(持久化队列),即使 RabbitMQ 服务器重启,消息仍然会保存在队列中。
作用场景:
队列的作用是 存储和传递消息。消息在队列中被保存,直到消费者来获取和处理消息。队列可以支持多种消费者,并且保证消息被处理一次且仅一次。
3. 路由键(Routing Key)
作用:
路由键是生产者在将消息发送给交换机时提供的一个字符串,用来指定消息的路由路径。交换机会根据路由键的内容,决定该消息应该发送到哪些队列。
- 在 Direct 交换机 中,路由键用于精确匹配。例如,路由键
task_queue
只会将消息发送到绑定了task_queue
路由键的队列。 - 在 Topic 交换机 中,路由键可以使用通配符进行模糊匹配。例如,
device.*
可以匹配device.data
和device.status
,但device.#
可以匹配多个词。
作用场景:
路由键的作用是 指定消息传递路径。交换机会根据路由键将消息发送到符合条件的队列。
三者的区别和作用总结:
名称 | 作用和功能 | 角色 | 区别 |
---|---|---|---|
交换机(Exchange) | 接收生产者的消息并根据路由键将消息发送到一个或多个队列。交换机本身不保存消息,只负责转发消息。 | 中间人 | 决定消息如何分发到不同的队列 |
队列(Queue) | 用于存储消息,等待消费者来处理。消费者从队列中拉取消息进行处理。队列是消息的最终接收点,消息只能在队列中被消费一次。 | 消费者终点 | 存储和传递消息 |
路由键(Routing Key) | 生产者指定的一个字符串,用来决定交换机如何将消息路由到队列。路由键可以是精确匹配或模糊匹配(使用通配符)。 | 消息路由控制 | 决定消息走向哪些队列 |
三者之间的关系:
- 生产者(Producer):向 交换机 发送消息,并指定一个 路由键。
- 交换机(Exchange):根据绑定的规则和 路由键,将消息转发到合适的 队列。
- 队列(Queue):消息最终到达 队列,并等待消费者取出并处理。
- 消费者(Consumer):从队列中取出消息进行处理。
流程示例:
假设我们有以下 RabbitMQ 配置:
- 交换机:
task_exchange
(类型为 Direct)。 - 队列:
task_queue
。 - 路由键:
task.new
.
消息传递过程:
- 生产者发送一条消息到
task_exchange
,并指定路由键为task.new
。 task_exchange
交换机会检查是否有队列绑定了task.new
路由键。- 如果
task_queue
队列绑定了task.new
路由键,交换机会将消息发送到task_queue
。 - 消费者从
task_queue
中拉取消息并进行处理。
这个流程说明了交换机、队列和路由键之间如何协同工作来完成消息的路由和处理。
常见应用场景:
-
Direct 交换机:
- 用于精确匹配路由键的场景,比如不同的任务类型对应不同的队列,确保消息到达正确的队列。
-
Fanout 交换机:
- 广播消息给多个消费者,常用于发布/订阅模式,比如推送系统消息给所有消费者。
-
Topic 交换机:
- 适用于需要根据复杂模式路由消息的场景,比如日志系统,路由键可以根据日志级别(如
error
、info
)路由到不同的队列。
- 适用于需要根据复杂模式路由消息的场景,比如日志系统,路由键可以根据日志级别(如
相关文章:
RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
RabbitMQ 是一个消息代理系统,使用交换机(Exchange)、队列(Queue)和路由键(Routing Key)来管理消息的传递。它们分别起到不同的作用,构成了消息从生产者到消费者的传递路径。 以下是…...

解码 OpenAI 的 o1 系列大型语言模型
OpenAI 表示,其 Strawberry 项目已升级为新的大型语言模型 (LLM) 系列,公司将其命名为 OpenAI o1。 该公司表示,新系列模型还包括一个 o1-mini 版本,以提高成本效益,可根据其推理能力与最新的GPT-4o 模型进行区分。 …...

大小端字节序 和 内存高低地址顺序
目录 1. 大小端字节序 1.1 什么是大小端字节序? 1.2 为什么有大小端字节序? 1.3 习题:用程序结果判断大端小端 2. 各种易混淆的高低地址顺序 2.1 监视窗口的地址表示【计算机标准展示方式】 2.2 横向地址表示 2.3 一个字节 与 多个字节 的地址…...

Spring扩展点系列-MergedBeanDefinitionPostProcessor
文章目录 简介源码分析示例示例一:Spring中Autowire注解的依赖注入 简介 spring容器中Bean的生命周期内所有可扩展的点的调用顺序 扩展接口 实现接口ApplicationContextlnitializer initialize AbstractApplicationContext refreshe BeanDefinitionRegistryPos…...
Centos 7.9 使用 crontab 实现开机启动
[rootlocalhost ~]# crontab -e [rootlocalhost ~]# reboot # crontab -e reboot /path/to/my/program # reboot 表示重启开机的时候运行一次 reboot /test/hello.sh 参考: Linux crontab 命令 https://www.runoob.com/linux/linux-comm-crontab.html Run prog…...

基于微信的设备故障报修管理系统设计与实现+ssm论文源码调试讲解
2相关技术 2.1微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的如虎添翼,发展迅猛。 2.2 MYSQL数据…...

yolo自动化项目实例解析(二)ui页面整理 1.78
我们在上一章整理main.py 的if __name__ __main__: 内容还留下面这一段, from PyQt5.QtWidgets import *from lanrenauto.moni.moni import *from PyQt5.QtGui import *app QApplication(sys.argv) # 初始化Qt应用ratio screen_width / 2560 # 分辨率比例# 设…...

PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目
项目地址: GitHub - github201014/PyQt-NativeWindow: A class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypesA class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypes - github201014/PyQt-NativeWindow…...
面试时遇见的项目问题
汽车在线销售平台项目 项目的甲方是谁? 甲方是一家汽车销售公司,他们希望通过互联网技术提升销售效率和服务质量 为什么要做这个项目? 很多消费者越来越倾向于在线上完成购车之前的大部分决策。所以甲方找到我们希望通过建立一个在线的销…...

在线骑行网站设计与实现
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装在线骑行网站软件来发挥其高效地信息处理的作用,…...
大批量查询方案简记(Mybatis流式查询)
Mybatis的流式查询 摘要: 介绍使用mybatis流式查询解决大数据量查询问题. 1 业务背景 开发中遇到一个业务,说起来也很无奈:公司用的数据库MySQL,一张表里只保留了一个月的数据,但是数据量竟然高达2000W还要多,然后用户有个需求也很恶心,为了完成这个业务我需要定时任务每一个月…...

python - 子类为什么调用父类的方法
菜鸟教程 - 面向对象https://www.runoob.com/python3/python3-class.html为什么写这个呢 ,因为很多时候,事情很简单,但我往往记住了使用方式,忘记了使用原因,也因为自己看到super()时,也想问为什么要用supe…...

【JavaScript】数据结构之字典 哈希表
字典 键值对存储的,类似于js的对象,但在js对象中键[key]都是字符串类型或者会转换成字符串类型,因此后声明的键值会覆盖之前声明的值。字典以map表示,map的键不会转换类型。 let map new Map() map.set(a, 1) map.set(b, 2) ma…...

Adobe出现This unlicensed Photoshop app has been disabled
Adobe Acrobat或Photoshop软件突然出现This unlicensed Photoshop app has been disabled 症状 解决方法 删除软件安装目录下的AcroCEF和acrocef_1l两个子文件夹。主要是为了删除AcroCEF.exe。 如果存在复发,则删除xxxxxxx\AdobeGCClient\AdobeGCClient.exe。 不…...
elementui 单元格添加样式的两种方法
方法一 <el-table-column fixed prop"name" label"姓名" width"120"> <<template scope"scope"> <span :class"{red:scope.row.color1,yell:scope.row.color2,green:scope.row.col…...
如何有效管理技术债务:IT项目中的长期隐患
如何有效管理技术债务:IT项目中的长期隐患 在软件开发和IT项目管理中,技术债务(Technical Debt)是一个经常被忽视却又至关重要的概念。技术债务就像金融债务一样,当我们在项目开发中选择了某些“捷径”来快速交付&…...

2024 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|大数据驱动的地理综合问题|数学建模完整代码+建模过程全解全析
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…...
Linux 清空redis缓存及查询key值
1.登录redis redis-cli -h 127.0.0.1 -p 6379# 如果有密码需要下面这一步 auth 你的密码直接带密码登录 redis-cli -h 127.0.0.1 -p 6379 -a 密码出现ok表示登录成功 2.标题查看所有key keys *3.查看某个key 的值 get keyName4.清空整个Redis服务器的数据 flushall5.查看…...

MySql调优(三)Query SQL优化(2)explain优化
explain执行计划出现以下情况,均需要优化: 一、Using temporary 查询执行过程中出现Using temporary提示,通常意味着MySQL需要创建一个临时表来存储中间结果。这种情况多发生在数据库优化器无法通过现有的索引直接有效地执行查询时…...

Java【代码 18】处理Word文档里的Excel表格数据(源码分享)
处理Word文档里的Excel表格数据 1.原始数据2.处理程序2.1 识别替换表格表头2.2 处理多余的换行符2.3 处理后的结果 3.总结 1.原始数据 Word 文档里的 Excel 表格数据,以下仅为示例数据: 读取后的字符串数据为: "姓名\r\n身份证号\r\n手…...

C# 中的对话框与导航:构建流畅用户交互的完整指南
在现代应用程序开发中,良好的用户交互体验是成功的关键因素之一。作为.NET开发者,熟练掌握C#中的对话框与导航技术,能够显著提升应用程序的易用性和专业性。本文将全面探讨Windows Forms、WPF、ASP.NET Core和MAUI等平台下的对话框与导航实现…...

自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架
英文标题:Adaptive Flow Scheduling for Teleoperation: A Communication and Control Co-Optimization Framework over Time-Sensitive Networks 中文标题:自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架 作者信息 …...
【Linux基础知识系列】第九篇-Shell脚本入门
在Linux世界中,Shell脚本是自动化任务和简化操作的重要工具。它可以帮助用户编写一系列命令,自动执行重复的任务,从而提高工作效率。在本篇文章中,我们将介绍Shell脚本的基本概念、编写方法、常用命令和结构。通过这些内容&#x…...
Selenium的底层原理
Selenium 底层主要依赖于 WebDriver 协议(即 W3C WebDriver 规范,早期也有 JSON Wire Protocol)来实现对浏览器的远程控制,其核心架构可以分为以下几层: Selenium 客户端(Client Library) 支持多…...

基于 HT for Web 的轻量化 3D 数字孪生数据中心解决方案
一、技术架构:HT for Web 的核心能力 图扑软件自主研发的 HT for Web 是基于 HTML5 的 2D/3D 可视化引擎,核心技术特性包括: 跨平台渲染:采用 WebGL 技术,支持 PC、移动端浏览器直接访问,兼容主流操作系统…...

MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】
文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址:Ollama 官网下载很慢,甚至出现了下载完显示 无法下载,需要授权 目…...

C# 控制台程序获取用户输入数据验证 不合规返回重新提示输入
在 C# 控制台程序中实现输入验证并循环重试,可以通过以下方式实现高效且用户友好的交互。以下是包含多种验证场景的完整解决方案: 一、通用输入验证框架 public static T GetValidInput<T>(string prompt, Func<string, (bool IsValid, T Val…...
4、ubuntu系统 | 文本和目录操作函数
1、目录操作函数 ls(列出目录内容) 用途:列出指定目录中的文件和子目录。语法:ls [选项] [路径]常用选项: -l:以长格式显示文件详细信息(权限、所有者、大小、时间等)。-aÿ…...

【春秋云镜】CVE-2022-26965 靶场writeup
知识点 网站的主题或者模块位置一般是可以上传文件的,不过一般为压缩包形式主题或者模块可以上github上找到和cms匹配的源码主题被解压后会放到加入到对应的文件夹中,而且还会自动执行对应的info.php文件(需要主题和cms配套才行)我这里取巧了࿰…...