【RabbitMQ】RabbitMQ中核心概念交换机(Exchange)、队列(Queue)和路由键(Routing Key)等详细介绍
博主介绍:✌全网粉丝21W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌
技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。
感兴趣的可以先关注收藏起来,在工作中、生活上等遇到相关问题都可以给我留言咨询,希望帮助更多的人。
RabbitMQ中核心概念交换机(Exchange)、队列(Queue)和路由键(Routing Key)等详细介绍
- 一、概览
- 二、核心概念
- 2.1 交换机(Exchange)
- 2.2 队列(Queue)
- 2.3 路由键(Routing Key)
- 2.4 消息的发送流程通常
- 三、 RabbitMQ其他概念
- 3.1 死信队列
- 3.2 队列类型
RabbitMQ 是一个消息代理系统,使用
交换机(Exchange)
、
队列(Queue)
和
路由键(Routing Key)
来管理消息的传递。它们分别起到不同的作用,构成了消息从生产者到消费者的传递路径。它们一起协同工作来实现消息的发布和订阅。
一、概览
三者的区别和作用总结
名称 | 作用和功能 | 角色 | 区别 |
---|---|---|---|
交换机(Exchange) | 接收生产者的消息并根据路由键将消息发送到一个或多个队列。交换机本身不保存消息,只负责转发消息。 | 中间人 | 决定消息如何分发到不同的队列 |
队列(Queue) | 用于存储消息,等待消费者来处理。消费者从队列中拉取消息进行处理。队列是消息的最终接收点,消息只能在队列中被消费一次。 | 消费者终点 | 存储和传递消息 |
路由键(Routing Key) | 生产者指定的一个字符串,用来决定交换机如何将消息路由到队列。路由键可以是精确匹配或模糊匹配(使用通配符)。 | 消息路由控制 | 决定消息走向哪些队列 |
三者之间的关系
- 生产者(Producer):向 交换机 发送消息,并指定一个 路由键。
- 交换机(Exchange):根据绑定的规则和 路由键,将消息转发到合适的 队列。
- 队列(Queue):消息最终到达 队列,并等待消费者取出并处理。
- 消费者(Consumer):从队列中取出消息进行处理。
二、核心概念
RabbitMQ 是一个开源的消息代理(Message Broker),用于在应用程序之间传递消息。它实现了高级消息队列协议(AMQP),提供了可靠的消息传递和消息路由机制,以支持分布式系统的开发。
2.1 交换机(Exchange)
作用:
交换机负责接收来自生产者的消息,并根据一定的路由规则将消息分发给一个或多个队列。它是生产者和队列之间的中间层,生产者永远不会直接将消息发送到队列,而是通过交换机。
种类:
RabbitMQ 中有几种类型的交换机,每种交换机的消息路由行为都不同:
- Direct(直连交换机):根据精确匹配路由键(Routing Key)来将消息转发到绑定了相同路由键的队列。
- Fanout(扇出交换机):不处理路由键,直接将消息广播给绑定到该交换机的所有队列。类似广播机制。
- Topic(主题交换机):根据路由键的模式匹配(可以使用通配符)将消息路由到符合条件的队列。
- Headers(头交换机):根据消息的 headers(头部信息)属性来路由,而不是使用路由键。
作用场景:
交换机的主要作用是 决定消息应该被发送到哪些队列,每种交换机的类型决定了消息的路由逻辑。
2.2 队列(Queue)
作用:
队列是消息的实际存储位置。消息被发送到队列后,消费者从队列中取出并处理。队列中的消息按照 先进先出(FIFO)
的顺序被消费者处理。
- 队列是点对点通信的终点,消费者从队列中拉取消息并处理,每个消息只会被一个消费者处理(除非有特别的广播机制)。
- 消息可以在队列中持久化(持久化队列),即使 RabbitMQ 服务器重启,消息仍然会保存在队列中。
作用场景:
队列的作用是 存储和传递消息。消息在队列中被保存,直到消费者来获取和处理消息。队列可以支持多种消费者,并且保证消息被处理一次且仅一次。
2.3 路由键(Routing Key)
作用:
路由键是生产者在将消息发送给交换机时提供的一个字符串,用来指定消息的路由路径。交换机会根据路由键的内容,决定该消息应该发送到哪些队列。
- 在 Direct 交换机 中,路由键用于精确匹配。例如,路由键
task_queue
只会将消息发送到绑定了task_queue
路由键的队列。 - 在 Topic 交换机 中,路由键可以使用通配符进行模糊匹配。例如,
device.*
可以匹配device.data
和device.status
,而device.#
可以匹配多个词。
作用场景:
路由键的作用是 指定消息传递路径。交换机会根据路由键将消息发送到符合条件的队列。
2.4 消息的发送流程通常
消息的发送流程通常如下:
生产者发布消息,指定交换机和路由键。
交换机根据路由键将消息路由到一个或多个队列。
消费者从队列中获取消息并处理它们。
通过这种方式,RabbitMQ实现了消息的可靠传递和分发,可以用于构建各种应用程序,包括消息队列、发布/订阅系统、任务分发等。
三、 RabbitMQ其他概念
AMQP:AMQP(Advanced Message Queuing Protocol)
是一种协议,用于定义消息传递的规范。RabbitMQ是AMQP协议的一个流行实现之一,它允许不同的应用程序之间通过消息进行通信。
以下是一些关于 RabbitMQ 的详细知识:
-
生产者:生产者是消息的发送方。它们创建消息并将其发布到 RabbitMQ 的交换机上。生产者通常将消息发送到一个或多个队列,以便消费者可以订阅并处理这些消息。
-
交换机:交换机是消息的路由中心,它接收从生产者发送的消息,并根据预定义的规则将它们路由到一个或多个队列中。RabbitMQ支持多种类型的交换机,包括直连、主题、扇出和头交换机。
-
队列:队列是消息的容器,它们用于存储消息,直到消费者准备好接收和处理它们。多个消费者可以订阅同一个队列,但只有一个消费者会接收到每条消息。
-
消费者:消费者是消息的接收方,它们订阅队列并从中获取消息。一旦消费者接收到消息,它们可以对消息进行处理,例如执行某些任务或将数据存储到数据库中。
-
绑定:绑定是交换机和队列之间的关联关系。它定义了如何将消息从交换机路由到队列。绑定通常使用路由键(Routing Key)来指定消息的路由规则。
-
虚拟主机:RabbitMQ 允许创建多个虚拟主机,每个虚拟主机都是一个独立的消息代理环境。虚拟主机之间相互隔离,允许不同应用程序在同一台 RabbitMQ 服务器上使用不同的消息队列。
-
持久化:消息和队列可以设置为持久化,这意味着它们将在 RabbitMQ 服务器重启后保留。这是确保消息不会丢失的重要方式,特别是对于关键的应用程序。
-
确认机制:RabbitMQ 提供了消息确认机制,确保消息在发送和接收过程中不会丢失。生产者可以等待来自消费者的确认,以确保消息已成功处理。
-
死信队列:RabbitMQ 允许定义死信队列,用于处理无法成功处理的消息。当消息无法被路由到队列时,它们可以被发送到死信队列,以后进行处理。
-
集群:RabbitMQ 支持集群模式,允许多个 RabbitMQ 服务器一起工作以提高可用性和性能。
-
插件系统:RabbitMQ 可以通过插件进行扩展,允许添加各种功能,如消息转换、身份验证、监控等。
RabbitMQ 是一个强大的消息代理,广泛用于分布式系统、微服务架构、任务队列、事件驱动架构等场景。了解这些基本概念可以更好地理解和使用 RabbitMQ 来构建可靠的消息通信系统。
3.1 死信队列
死信队列(Dead Letter Queue,简称DLQ)是消息队列系统中的一个重要概念,它用于处理无法成功被消费的消息。当消息无法被消费者正常处理时,通常会被发送到死信队列,以后进行进一步的处理或分析。以下是有关死信队列的详细信息:
什么是死信队列:
消息在队列中过期,即超过了一定的存活时间。
消息被拒绝(NACK)并且无法重新投递。
消息在消费者处理时发生了异常。
死信队列是一个特殊的队列,用于接收无法被消费者成功处理的消息。这些消息被认为是"死信",通常是由于以下原因之一:
为什么使用死信队列:
死信队列的主要目的是处理消息处理失败或异常情况,以防止消息丢失。通过将死信消息路由到特定的队列,你可以进行进一步的调查、日志记录、错误处理或重试。
死信队列还可以用于延迟消息处理,例如在一段时间后重新尝试处理失败的消息。
设置死信队列:
要设置死信队列,你需要创建一个普通队列,并为它配置一个死信交换机(Dead Letter Exchange)和一个死信路由键(Dead Letter Routing Key)。
当消息成为死信时,它们将被重新路由到死信交换机,并使用死信路由键发送到死信队列。
应用场景:
重试机制:当消息处理失败时,可以将消息发送到死信队列,然后在稍后的时间内重新尝试处理。
日志记录和监控:可以将失败的消息记录到日志中以进行分析和监控。
错误处理:可以通过死信队列执行自定义错误处理逻辑,例如发送通知或触发报警。
死信队列可以用于处理各种应用场景,例如:
总之,死信队列是消息队列系统中的一个关键组件,用于处理处理失败的消息,以提高系统的可靠性和容错性。通过合理配置和使用死信队列,可以更好地管理消息的生命周期和处理失败情况。不同的消息队列系统(如RabbitMQ、Kafka等)都支持死信队列的概念,但具体的配置和用法可能有所不同。
3.2 队列类型
消息队列系统通常支持多种队列类型,每种类型都适用于不同的使用场景和需求。以下是一些常见的队列类型及其特点:
- FIFO 队列(First-In-First-Out):
特点:消息按照它们进入队列的顺序进行处理,即先进先出。
用途:适用于需要按照顺序处理消息的场景,确保消息的顺序性。
- 优先级队列:
特点:消息可以分配不同的优先级,高优先级的消息将被优先处理。
用途:适用于需要按照优先级处理消息的场景,确保高优先级消息能够尽快处理。
- 延迟队列(Delay Queue):
特点:消息可以设置延迟时间,在指定时间后才会被处理。
用途:适用于需要延迟处理消息的场景,如定时任务或消息重试。
- 扇出队列(Fanout Queue):
特点:消息被广播到所有绑定的队列,每个队列都会接收一份消息的副本。
用途:用于发布/订阅模式,消息广播到多个消费者,每个消费者都可以独立处理消息。
- 主题队列(Topic Queue):
特点:消息根据主题或通配符路由到匹配的队列。
用途:用于高度灵活的消息路由,支持复杂的消息过滤和匹配规则。
- 直连队列(Direct Queue):
特点:消息根据指定的路由键路由到匹配的队列。
用途:用于简单的消息路由,每个队列通常与一个唯一的路由键相关联。
- 持久队列:
特点:队列和消息可以设置为持久化,确保在消息代理重启后不会丢失。
用途:用于关键数据和任务的持久化存储,确保数据不会丢失。
- 临时队列:
特点:队列通常是临时的,只在连接期间存在,连接断开后会自动删除。
用途:适用于一次性任务或短期通信的场景。
- 死信队列(Dead Letter Queue):
特点:用于处理无法成功处理的消息,将失败的消息发送到死信队列以后续处理。
用途:用于处理失败的消息,执行错误处理或重试。
不同的队列类型适用于不同的业务需求和应用场景。在选择队列类型时,需要根据具体需求来权衡各种特性和限制。根据消息队列系统的不同,支持的队列类型和功能可能有所不同。
好了,今天分享到这里。希望你喜欢这次的探索之旅!不要忘记 “点赞” 和 “关注” 哦,我们下次见!🎈
本文完结!
祝各位大佬和小伙伴身体健康,万事如意,发财暴富,扫下方二维码与我一起交流!!!
相关文章:
【RabbitMQ】RabbitMQ中核心概念交换机(Exchange)、队列(Queue)和路由键(Routing Key)等详细介绍
博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
【AI知识】过拟合、欠拟合和正则化
一句话总结: 过拟合和欠拟合是机器学习中的两个相对的概念,正则化是用于解决过拟合的方法。 1. 欠拟合: 指模型在训练数据上表现不佳,不能充分捕捉数据的潜在规律,导致在训练集和测试集上的误差都很高。欠拟合意味着模…...
计算机毕设-基于springboot的航空散货调度系统的设计与实现(附源码+lw+ppt+开题报告)
博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...
视图、转发与重定向、静态资源处理
目录 视图 默认视图 视图机制原理 自定义视图 请求转发与重定向 静态资源处理 视图 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性 可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高 默认是最低优先级,Integer.MAX_…...
优选算法——分治(快排)
1. 颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) 题目展示: 题目分析:本题其实就要将数组最终分成3块儿,这也是后面快排的优化思路,具体大家来看下图。 这里我们上来先定义了3个指针&…...
【Linux系统】文件系统
Windows 和 Linux 的文件系统: windows:NTFS —> NTFS:磁盘大于目录:目录是磁盘的一部分。ubuntu :EXT4 —> EXT4: 目录大于磁盘:磁盘是目录的一部分。 Windows文件系统的特点 基于分区的文件系统: Windows…...
javaweb的基础
文章的简介: 页面的展示(HTML)页面的修改、绑定、弹窗(js的dom、bom等)页面的请求(Ajax) 1、在HTML中用标签和css样式实现了浏览器页面。 2、用JS实现页面内容(图片,复选框、文本颜色内容)的修改和弹框&…...
家里养几条金鱼比较好?
金鱼,作为备受喜爱的家庭水族宠物,其饲养数量一直是众多养鱼爱好者关注的焦点。究竟养几条金鱼最为适宜,实则需要综合考量多方面因素,方能达到美观、健康与和谐的理想养鱼境界。 从风水文化的视角来看,金鱼数量有着诸…...
写作词汇积累:差池、一体两面、切实可行极简理解
差池 【差池】可以是名词,是指意外的事或错误。 【差池】也可以是形容词,是指参差不齐、差劲或不行。 1. 由于操作不当,导致这次实验出现了【差池】,我们需要重新分析原因并调整方案。(名词,表示意外的事…...
移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX
演示地址: http://134.175.123.194:8811 admin admin 演示视频: https://www.bilibili.com/video/BV196q2YQEDP 主要功能 WatchDog 1. 守护进程 2. OTA远程升级 TBOX 1. 数据采集、数据可视化、数据上报(内置Modbus TCP/RTU/ASCII,GPS协…...
LEED绿色建筑认证最新消息
关于LEED绿色建筑认证的最新消息,可以从以下几个方面进行概述: 一、认证体系更新与发展 LEED认证体系不断更新和完善,以更好地适应全球绿色建筑的发展趋势。例如,LEED v4能源更新已通过投票,并于2024年3月1日全面启用…...
SpringBoot中集成常见邮箱中容易出现的问题
本来也没打算想写得。不过也是遇到一些坑,就记录一下吧,也折腾了小半天 1.maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2…...
webstorm开发uniapp(从安装到项目运行)
1、下载uniapp插件 下载连接:Uniapp Tool - IntelliJ IDEs Plugin | Marketplace (结合自己的webstorm版本下载,不然解析不了) 将下载到的zip文件防在webstorm安装路径下,本文的地址为: 2、安装uniapp插…...
C# 探险之旅:第七节 - 条件判断(三元判断符):? : 的奇妙冒险
嘿,勇敢的探险家们!欢迎来到 C# 编程世界的奇妙之旅的第七节。今天,我们要探索的是一个神秘而强大的宝藏——三元判断符 ? :。别怕,它听起来复杂,但实际上比找宝藏还简单! 场景设定:宝藏的选择…...
FlinkCDC实战:将 MySQL 数据同步至 ES
📌 当前需要处理的业务场景: 将订单表和相关联的表(比如: 商品表、子订单表、物流信息表)组织成宽表, 放入到 ES 中, 加速订单数据的查询. 同步数据到 es. 概述 1. 什么是 CDC 2. 什么是 Flink CDC 3. Flink CDC Connectors 和 Flink 的版本映射 实战 1. 宽表查…...
debug小记
红框: 步过:遇到方法不想进入方法 绿框:代码跑在第几行也可以看见 蓝框:可以显示变量的值,三种方式都可以看变量的值...
Qt C++ 显示多级结构体,包括结构体名、变量名和值
文章目录 mainwindow.hmainwindow.cppstructures.hmain.cpp QTreeView 和 QStandardItemModel 来实现。以下是实现这一功能的步骤和示例代码: 定义多级结构体: 假设你有一个多级结构体,如下所示: struct SubStruct {int subValue…...
【JAVA】旅游行业中大数据的使用
一、应用场景 数据采集与整合:全面收集旅游数据,如客流量、游客满意度等,整合形成统一数据集,为后续分析提供便利。 舆情监测与分析:实时监测旅游目的地的舆情信息,运用NLP算法进行智能处理,及…...
【AI+网络/仿真数据集】1分钟搭建云原生端到端5G网络
导语: 近期智慧网络开放创新平台上线了端到端网络仿真能力,区别于传统的网络仿真工具需要复杂的领域知识可界面操作,该平台的网络仿真能力主打一个小白友好和功能专业。 https://jiutian.10086.cn/open/jiutian.10086.cn/open/ 端到端仿…...
微服务-01【续】
1.OpenFeign 上篇文章我们利用Nacos实现了服务的治理,利用利用RestTemplate实现了服务的远程调用。但是远程调用的代码太复杂了: 而且这种调用方式,与原本的本地方法调用差异太大,编程时的体验也不统一,一会儿远程调用…...
测试工程师八股文01|Linux系统操作
一、Linux系统操作 1、gzip tar和gzip结合使用 $ tar czf b.tar.gz *txt 以gzip方式打包并且压缩 $ tar xzf b.tar.gz -C btar 以gzip方式解压并解包,如果 btar 目录不存在,则需要先手动创建该目录。 代码第二行:如果没有指定 -C …...
【Qt】qt基础
目录 一、使用Qt Creator创建qt项目 二、项目文件解析 三、Qt中创建图形化界面的程序的两种方法 四、对象树 五、Qt中处理打印乱码问题的利器:qDebug() 一、使用Qt Creator创建qt项目 1.选择项目模板 选中第一类模板Application(Qt应用程序,包含普…...
UniScene:Video、LiDAR 和Occupancy全面SOTA
论文: https://arxiv.org/pdf/2412.05435 项目页面:https://arlo0o.github.io/uniscene/ 0. 摘要 生成高保真度、可控制且带有标注的训练数据对于自动驾驶至关重要。现有方法通常直接从粗糙的场景布局生成单一形式的数据,这不仅无法输出多样化下游任务…...
TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(1)——神经网络与模型训练过程详解 0. 前言1. 神经网络基础1.1 神经网络简介1.2 神经网络的训练1.3 神经网络的应用 2. 从零开始构建前向传播2.1 计算隐藏层节点值2.2 应用激活函数2.3 计算输出层值2.4 计算损失值2.4.1 在连续变…...
03篇--二值化与自适应二值化
二值化 定义 何为二值化?顾名思义,就是将图像中的像素值改为只有两种值,黑与白。此为二值化。 二值化操作的图像只能是灰度图,意思就是二值化也是一个二维数组,它与灰度图都属于单信道,仅能表示一种色调…...
基于python的一个简单的压力测试(DDoS)脚本
DDoS测试脚本 声明:本文所涉及代码仅供学习使用,任何人利用此造成的一切后果与本人无关 源码 import requests import threading# 目标URL target_url "http://47.121.xxx.xxx/"# 发送请求的函数 def send_request():while True:try:respo…...
基于 Spring Boot 实现图片的服务器本地存储及前端回显
??导读:本文探讨了在网站开发中图片存储的各种方法,包括本地文件系统存储、对象存储服务(如阿里云OSS)、数据库存储、分布式文件系统及内容分发网络(CDN)。文中详细对比了这些方法的优缺点,并…...
深入 TCP VJ-Style
接着 TCP 的文化内涵 继续扯一会儿。 自 30 instruction TCP receive 往前追溯,论文 Jacobson88 源自第一次拥塞崩溃,这篇著名文档在同时期的另一个缘起是另一篇考古文献 [Zhang86] Why TCP Timers Don’t Work Well,后面这篇文献提出了 TCP…...
go高性能单机缓存项目
代码 // Copyright 2021 ByteDance Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apach…...
数据结构绪论
文章目录 绪论数据结构三要素算法 🏡作者主页:点击! 🤖数据结构专栏:点击! ⏰️创作时间:2024年12月12日01点09分 绪论 数据是信息的载体,描述客观事物属性的数、字符及所有能输入…...
广东免费建站公司/南京百度推广
2816. Troywar loves Maths ★★☆ 输入文件:Troy_1.in 输出文件:Troy_1.out 简单对比 时间限制:1 s 内存限制:256 MB 【题目描述】 众所周知,Troywar总是不好…...
网站建设新趋势/自动点击器软件
各种按钮之间的继承关系: 一、 Basic Button 的基本用法: 1. 在布局文件 (main.xml) 增加对按钮的相关属性进行如下描述: < Button android:id "id/basic_button" android:layout_width "wrap_content" android…...
大连中山区网站建设/大庆黄页查询电话
前言 首先说明,对于JavaScript这门脚本语言,我是个菜鸟。虽然也写过不少JavaScript代码,但一直是不求甚解,直到最近才开始系统学习这门语言。学习的原因是我即将毕业,过了年就要正式工作了,而我要入职的职位…...
哪里有学习做网站的/网络营销方式都有哪些
2016-12-12 11:57:12使用ajax的开发项目过程中,经常需要将json格式的字符串返回到前端,前端解析成js对象(JSON )。如果直接以json的格式返回则方便很多,有时候通过后台直接写到页面中则会以字符串的方式存在,那么就用到了将字符串…...
网站做的好是不是影响就大/免费的网站域名查询
C字符串长度定义规范 (转载请注明来源于金庆的专栏) 因为总是见到C字符串长度相关的错误, 所有定个规范出来, 有利于减少错误. 关键在于C字符串有个结尾0, 处理时需要注意. 定义字符串长度有两种方式, 一种是用字符串的大小, 一种是字符串的长度.字符…...
怎么做多个域名指向一个网站/外贸谷歌推广怎么样
可以使用以下 SQL 查询来实现: SELECT teacher_id, teacher_name, title, course_name, evaluation, evaluation_level FROM teachers JOIN courses ON teachers.teacher_id courses.teacher_id其中,teachers 表存储教师的信息,包括教师号、…...