【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.datadevice.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):

特点:用于处理无法成功处理的消息,将失败的消息发送到死信队列以后续处理。

用途:用于处理失败的消息,执行错误处理或重试。

不同的队列类型适用于不同的业务需求和应用场景。在选择队列类型时,需要根据具体需求来权衡各种特性和限制。根据消息队列系统的不同,支持的队列类型和功能可能有所不同。


好了,今天分享到这里。希望你喜欢这次的探索之旅!不要忘记 “点赞” 和 “关注” 哦,我们下次见!🎈

本文完结!

祝各位大佬和小伙伴身体健康,万事如意,发财暴富,扫下方二维码与我一起交流!!!在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔记】AVL树的深度剖析

【C笔记】AVL树的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】AVL树的深度剖析前言一. AVL树的概念二.AVL树的实现2.1 AVL树的结构2.2 AVL树的插入2.3 平衡因子更新 三.旋转3.1旋转的原则3.2右单旋3.3左…

Ubuntu 环境安装 之 RabbitMQ 快速入手

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

IAR环境下的FlashLoader设计

目录 1.为什么要Flash Loader 2.Flash Loader设计细节 2.1 简单的代码框架 2.2 迷人的宏使用 2.3 关键的配置文件 3.dmac和mac文件 4.小结 搞国产车规芯片,IAR是必不可少的编译调试集成工具,历史背景不赘述,今天主要聊聊基于IAR的Fla…

一些硬件知识【2024/12/6】

MP6924A: 正点原子加热台拆解: PMOS 相比 NMOS 的缺点: 缺点描述迁移率低PMOS 中的空穴迁移率约为电子迁移率的 1/3 到 1/2,导致导通电流较低。开关速度慢由于迁移率较低,PMOS 的开关速度比 NMOS 慢,不适合高速数字电…

在本地运行大语言模型

1,打开下面网站下载,软件 lm studio 2, 设置模型下载路径 3,没有魔法条件的人,去镜像网站下载模型的镜像文件 、 4,

【单片机】ESP32-S3+多TMC2209控制步进电机系列3 使用TMC2209库实现UART通讯

目录 1.下载TMC2209.h库2.代码部分3.效果展示 1.下载TMC2209.h库 在Arudino环境中,有两个不错的库可以驱动TMC2209。 TMC2209库TMCStepper库 TMC2209库只针对TMC2209驱动器,而TMCStepper库除了能够支持TMC2209驱动器,还能够支持其他TMC的驱…

【服务器部署应用由http协议切换为https】

文章目录 服务器部署应用由http协议切换为https1. 下载openssl及其配置1.1 下载1.2 无脑下一步即可1.3 环境变量配置1.4 验证配置以及生成证书证书路径 2. nginx配置修改 服务器部署应用由http协议切换为https 1. 下载openssl及其配置 1.1 下载 openssl下载地址 根据系统选择…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义:root用户是Linux系统中的最高权限用户,具有对系统所有资源的完全控制权。特性:root用户可以执行系统中的任何操作,包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时,就会阻塞等待。 阻塞等待…

如何在树莓派上安装Arduino IDE

git clone https://github.com/JetsonHacksNano/installArduinoIDE.git cd installArduinoIDE ./installArduinoIDE.sh sudo reboot sudo shutdown -h now

【JAVA项目】基于ssm的【汽车在线销售系统】

【JAVA项目】基于ssm的【汽车在线销售系统】 技术简介:采用JSP技术、B/S架构、SSM框架、MySQL技术等实现。 系统简介:首页汽车在线销售系统模块如下:首页、汽车信息、新闻资讯、留言反馈、我的收藏管理等功能。管理员输入个人的账号、密码登录…

【代码随想录】刷题记录(66)-修剪二叉搜索树

题目描述: 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父…

《蓝桥杯比赛规划》

大家好啊!我是NiJiMingCheng 我的博客:NiJiMingCheng 这节课我们来分享蓝桥杯比赛规划,好的规划会给我们的学习带来良好的收益,废话少说接下来就让我们进入学习规划吧,加油哦!!! 一、…

Vue3+Vite项目从零搭建+安装依赖+配置按需导入

环境准备 Vscode/HBuilder等任何一种前端开发工具node.js&npm本地开发环境 源代码管理:Git 技术栈 项目构建 创建项目 npm create vite 依次运行最后三行出现,成功启动项目 在浏览器输入 http://localhost:5173/ 可以显示页面 src别名的配置…

小程序维护外包流程和费用

由于某些原因很多老板想要跟换掉小程序原来合作的开发公司,重新把小程序系统维护外包新的公司。小程序系统外包维护是一个涉及多个方面的过程,需要从需求明确、选择团队到持续优化等多个环节进行细致管理。以下就是小程序系统外包维护主要包括几个关键步…

Meta Llama 3.3 70B:性能卓越且成本效益的新选择

Meta Llama 3.3 70B:性能卓越且成本效益的新选择 引言 在人工智能领域,大型语言模型一直是研究和应用的热点。Meta公司最近发布了其最新的Llama系列模型——Llama 3.3 70B,这是一个具有70亿参数的生成式AI模型,它在性能上与4050…

【数字图像处理】期末实验,基于直方图均衡化实验, 空间域图像增强, 数字图像傅里叶变化、频域图像处理,基于Hough变换的边缘检测

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…