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手…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
