目录

一、RabbitMQ 核心概念

 1.1整体框架

 1.2元素详解

1.2.1 生产者(Producer)&消费者(Consumer)

1.2.2 交换机(Exchange)

①fanout (广播型)

②direct (直连型)

③topic型(支持模糊匹配型)

④headers (不推荐使用)

1.2.3 消息队列(Queue)

1.2.4 消息中间站中间节点(Broker) 

1.2.5 绑定键(Binding Key)&&路由键(Routing Key)

💡总结

二、其他队列概述

2.1 死信队列

导致死信的几种原因:

2.2 延迟队列(Delay Queue)

2.3 优先级队列(Priority Queue)

🔍延伸思考


🧠在消息队列:数字化通信的高效纽带-CSDN博客  文章中已经对消息队列有了基础的理解

RabbitMQ 是一个开源的消息代理(Message Broker),实现了 高级消息队列协议(AMQP),用于在分布式系统中实现 异步通信。它解耦了消息的生产者(发送方)和消费者(接收方),使系统更灵活、可扩展。

一、RabbitMQ 核心概念

💡RabbitMQ主要涉及以下元素:

  1. 生产者(Producer):发送消息的应用。
  2. 消费者(Consumer):接收并处理消息的应用。
  3. 消息队列(Queue):存储消息的缓冲区(默认先进先出)。
  4. 交换机(Exchange):接收生产者消息,并按规则路由到队列(类似邮局)。
  5. 绑定(Binding):定义交换机和队列之间的关系(路由规则)。
  6. 消息(Message):包含头部(headers)、正文(body)和元数据。

 RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。

可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ就好比由邮局、邮箱和邮递员组成的一个系统。从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。

 1.1整体框架

 1.2元素详解

1.2.1 生产者(Producer)&消费者(Consumer

  • Producer(生产者) :生产消息的一方(寄信人)
  • Consumer(消费者) :消费消息的一方(邮件收件人)

消息一般由 2 部分组成:消息头(或者说是标签 Label)和 消息体。消息体也可以称为 payLoad ,消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括 routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。生产者把消息交由 RabbitMQ 后,RabbitMQ 会根据消息头把消息发送给感兴趣的 Consumer(消费者)

1.2.2 交换机(Exchange)

在 RabbitMQ 中,消息并不是直接被投递到 Queue(消息队列) 中的,中间还必须经过 Exchange(交换器) 这一层,Exchange(交换器) 会把我们的消息分配到对应的 Queue(消息队列) 中。

💡生产者 → 交换机
如果这一步失败(比如交换机不存在、网络中断),消息不会进入系统,而是直接被丢弃或返回给生产者(取决于 publisher confirm 和 mandatory 的设置),不会进入死信队列(死信队列后面会讲)。

RabbitMQ 的 Exchange(交换器) 有4种类型,不同的类型对应着不同的路由策略direct(默认)fanouttopic, 和 headers,不同类型的Exchange转发消息的策略有所区别。

①fanout (广播型)

fanout 类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,不需要做任何判断操作,所以 fanout 类型是所有的交换机类型里面速度最快的。fanout 类型常用来广播消息

②direct (直连型)

direct 类型的Exchange路由规则也很简单,它会把消息路由到那些 Bindingkey 与 RoutingKey 完全匹配(绑定键==路由键)的 Queue 中。

即:如果发送消息的时候设置路由键为“warning”,那么消息会路由到 Queue1 和 Queue2。如果在发送消息的时候设置路由键为"Info”或者"debug”,消息只会路由到Queue2。如果以其他的路由键发送消息,则消息不会路由到这两个队列中。

direct 类型常用在处理有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。

③topic型(支持模糊匹配型)

direct类型的交换器严格的匹配方式在很多情况下不能满足实际业务的需求。所以topic类型的交换器在匹配规则上进行了扩展,它与 direct 类型的交换器相似,也是将消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但这里的匹配规则有些不同,它约定:

  • RoutingKey 与 BindingKey 进化成都是以点号“.”分割的单词串
  • BindingKey 中可以存在两种特殊字符串"*"和"#",用于做模糊匹配,其中"*"用于匹配一个单词"#"用于匹配多个单词(可以是零个)

所以根据规则可知:

  • 路由键为 “com.rabbitmq.client” 的消息会同时路由到 Queuel 和 Queue2;
  • 路由键为 “com.hidden.client” 的消息只会路由到 Queue2 中;
  • 路由键为 “com.hidden.demo” 的消息只会路由到 Queue2 中;
  • 路由键为 “java.rabbitmq.demo” 的消息只会路由到Queuel中;
  • 路由键为 “java.util.concurrent” 的消息将会被丢弃或者返回给生产者(需要设置 mandatory 参数),因为它没有匹配任何路由键。
④headers (不推荐使用)

看 routing-key,只看 消息 headers

绑定队列时写一组 Key-Value;消息里 Key-Value完全一致才命中。

可加 x-match = any/all
any 只要有一个键值匹配即可;
all(默认)必须全部键值都匹配。

所以说这个类型的交换机性能极差,不推荐使用

1.2.3 消息队列(Queue)

Queue(消息队列) 用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

RabbitMQ 中消息只能存储在 队列 中,这一点和 Kafka 这种消息中间件相反。Kafka 将消息存储在 topic(主题) 这个逻辑层面,而相对应的队列逻辑只是topic实际存储文件中的位移标识。 RabbitMQ 的生产者生产消息并最终投递到队列中,消费者可以从队列中获取消息并消费。

多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,这样避免的消息被重复消费。

RabbitMQ 不支持队列层面的广播消费,如果有广播消费的需求,需要在其上进行二次开发,这样会很麻烦,不建议这样做。

💡总结

  1. 消息只能落到队列,队列是 RabbitMQ 的物理终点。

  2. 一个队列可被多个消费者订阅,消息以轮询的方式均摊,天然避免重复消费。

  3. 队列本身无广播能力,如需“每人一条”只能用多个队列或二次开发,不推荐。

1.2.4 消息中间站中间节点(Broker) 

💡RabbitMQ Broker ≈ 一个独立的 RabbitMQ 进程/容器/服务器节点,负责接收连接、管理交换机、队列和消息的核心服务单元。

1.2.5 绑定键(Binding Key)&&路由键(Routing Key)

维度路由键 (Routing Key)绑定键 (Binding Key)
谁产生生产者在发送消息时设置管理员/消费者在“把队列绑定到交换机”时设置
作用对象消息本身队列与交换机的绑定关系
作用时机消息到达交换机时,交换机用它来做路由交换机收到消息后,用它与消息中的路由键做匹配
使用场景只在发送消息时用到只在创建绑定时用到
格式限制任意字符串(具体规则取决于交换机类型)与路由键格式一致;
举个例子生产者发消息时:routingKey = "order.paid"消费者绑定时:bindingKey = "order.*"
💡总结

1.路由键(Routing Key)--消息的固有属性

  • 消息自带的一个字段,在创建/发布消息时由生产者指定,是消息本身的属性之一。
  • 相当于写在信封上的“收件人线索”,消息一出生就带着它。

2.绑定键(Binding Key)--交换机侧的路由规则

  • 不是消息的一部分,而是队列在绑定到交换机时设立的匹配规则
  • 相当于“邮局分拣员”手里的“收件条件表”,用来决定哪些信封(消息)可以放进哪个投递箱(队列)。

二、其他队列概述

2.1 死信队列

DLX,全称为 Dead-Letter-Exchange,死信交换器,死信邮箱。当消息在一个队列中变成死信 (dead message) 之后,它能被重新发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。

导致死信的几种原因:

  • 消息被拒(Basic.Reject /Basic.Nack) 且 requeue = false
  • 消息 TTL 过期。
  • 队列满了,无法再添加。

 简而言之,就是交换机的消息无法抵达正常队列时,就会进入死信队列。

2.2 延迟队列(Delay Queue)

消息不立即投递,而是等待指定的“延迟时间”到期后才对消费者可见。

2.3 优先级队列(Priority Queue)

队列中的消息按优先级字段排序,优先级高的消息先被消费,低优先级的后出队。

特性原生支持实现思路备注
优先级队列队列声明时加 x-max-priority=N;消息加 priority 属性(0-N)性能随优先级级别增加而下降
延迟队列❌(3.12 起实验性支持)需借助插件或“TTL+DLX”技巧官方推荐 rabbitmq-delayed-message-exchange 插件

🔍延伸思考

  1. 怎么验证消息丢没丢?
  2. 如何保障消息顺序性?
  3. 如何保障消息事务性,保证消息不重复消费?    

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks × MinIO:打造灵活高效的存算分离方案

“存算分离”(Decoupled Storage and Compute)是一种在现代数据系统中被广泛采用的架构设计。它将计算和存储解耦,使二者可以独立扩展,提升资源利用率并降低运维成本。StarRocks 从 3.0 版本开始支持这一架构,允许用户…

R语言的分位数回归实践技术高级应用

回归是科研中最常见的统计学研究方法之一,在研究变量间关系方面有着极其广泛的应用。由于其基本假设的限制,包括线性回归及广义线性回归在内的各种常见的回归方法都有三个重大缺陷:(1)对于异常值非常敏感,极少量的异常值可能导致结…

Tomcat的部署、单体架构、session会话、spring

一、Tomcat的部署①②③④⑤二.web项目在tomcat服务中如何运行:1.web项目源码部署在服务器的webapps目录里面2.将web项目打包(war),部署在服务器的webapps目录里面。三 单体架构和前后端分离单体架构是将所有功能模块(包括前端界面、后端逻辑、数据库交互…

海康威视视觉算法岗位30问及详解

海康威视视觉算法岗位30问及详解 前言 视觉算法工程师是人工智能领域的热门岗位,尤其在安防、自动驾驶、工业检测等行业有着广泛应用。海康威视作为行业龙头,对视觉算法岗位的要求较高,面试问题既考察基础理论,也关注工程实现。本…

14.7 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀

文章目录 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀 指令微调格式:Alpaca Format 深度解析 14.3.1 Alpaca 格式诞生背景与技术价值 14.3.2 Alpaca 格式结构解析 14.3.3 实战 Dolly-15K 数据转 Alpaca 格式 14.3.4 Alpaca 格式的工程化实践 14.3.5 格式扩展与挑战应…

42.sentinel实现线程隔离

线程隔离有两种实现方式: 1.线程池隔离 优点: 1.支持主动超时,线程池中的线程都是可控的,可以停掉某个线程。 2.支持异步调用,每个请求都是一个独立的线程,线程之间不受影响。 缺点: 线程的额外开销比较大 适用场景: 低扇出(一个微服务,不会依赖很多微服务)…

【过拟合和欠拟合】——深度学习.全连接神经网络

目录 1 概念认知 1.1 过拟合 1.2 欠拟合 1.3 如何判断 2 解决欠拟合 3 解决过拟合 3.1 L2正则化 3.1.1 数学表示 3.1.2 梯度更新 3.1.3 作用 3.1.4 代码实现 3.2 L1正则化 3.2.1 数学表示 3.2.2 梯度更新 3.2.3 作用 3.2.4 与L2对比 3.2.5 代码实现 3.3 Drop…

Java设计模式之行为型模式(备忘录模式)应用场景分析

最近看到一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 一、用户交互与编辑操作 文本编辑器撤销/重做 场景描述:用户编辑文档时,可通过CtrlZ撤销误操作,或通过Ctr…

5.Java的4个权限修饰符

1.private(私有访问权限)最严格的访问修饰符,它限定被修饰的成员仅能在声明它的当前类内部访问。其他任何外部类都无法直接访问该成员。作用:强制封装,确保类内部实现细节的隐藏性和数据安全性2.默认权限(包…

Linux入门介绍

目录 一、环境 二、Linux发展历史 1、计算机 2、操作系统 四、认识Linux的 内核版本名称 一、环境 一般是Centos 7 Ubuntu 20.04 / 22.04 前者已经停止更新与维护,但很多公司还在使用前者 二、Linux发展历史 1、计算机 1945年 2.14---埃尼阿克---军事用处&…

spring boot2升级boot3

spring boot2升级boot3 整体流程如下 1、借助于开源的自动化代码重构工具OpenRewrite,快速地进行代码重构等 2、相关坐标升级更改 3、配置文件属性更改 4、打包、构建与运行验证 1. 前期准备工作第一步:确保升级之前项目是可编译运行的第二步&#xff1a…

mac终端设置代理

在Mac上配置终端走代理,需设置终端(如zsh或bash)使用HTTP/HTTPS/SOCKS代理,以便命令行工具(如curl、git、npm)通过代理访问网络。以下是详细步骤,适用于macOS 10.15及以上版本。 前提条件 代理服…

VSTO Excel中打开WinForm.ShowDialog()后,如果要使用当前的wb.Application在后台操作其他Excel文件(保持隐藏状态)

在VSTO Excel中打开WinForm.ShowDialog()后,如果要使用当前的wb.Application在后台操作其他Excel文件(保持隐藏状态),可以通过以下几种方式实现: 方法一:设置Application属性控制可见性 // 在WinForm中获取…

【网络安全】DDOS攻击

如果文章不足还请各位师傅批评指正!你有没有过这种经历:双 11 抢券时页面卡成幻灯片,游戏团战突然全员掉线,刷视频时进度条永远转圈圈?除了 “网渣”,可能还有个更糟的原因 —— 你正被 DDoS 攻击 “堵门”…

第9天 | openGauss中一个表空间可以存储多个数据库

接着昨天继续学习openGauss,今天是第9天了。今天学习内容是o一个数据库可以存储在多个表空间中。 老规矩,先登陆墨天轮为我准备的实训实验室 rootmodb:~# su - omm ommmodb:~$ gsql -r作业要求 1.创建表空间newtbs1 omm# CREATE TABLESPACE newtbs1 RELATIVE LOCATI…

H3C路由器模拟PPPOE拨号

拓扑简图 效果图 PPPoE服务器端脚本 1. 基础配置 system-view sysname PPPoE-Server # 可选,设置设备名称2. 创建本地用户(认证账号)​ local-user pppuser class network # 创建网络类用户 password simple 123456 # 设置密码(PAP/CHAP共用) service-type ppp #

Github Actions Workflows 上传 Dropbox

一、注册 访问 https://www.dropbox.com/register选择 "个人" 如果想免费使用,一定要选择 “继续使用2GB的Dropbox Basic 套餐”,如下: 二、在 Dropbox 中 创建app 需要去注册的邮箱中验证一下邮箱.访问 https://www.dropbox.com…

生产管理系统实现生产全过程可视化

随着现代工业的不断发展,智能制造、数字化转型已成为企业提高竞争力的重要途径。生产管理作为企业运营的核心环节,直接关系到产品质量、生产效率以及成本控制。传统的生产管理方式大多依赖手工记录和经验管理,存在信息滞后、数据不一致、响应…

CSS实现背景色下移10px

众所周知,背景颜色是不能移动的,通常是填充满当前容器。 不过可以想想其它办法。。 🧐 利用css3的线性属性linear,在垂直方向向下推要移动的距离设成透明颜色,能在视觉上巧妙实现下移的效果。 .title {height: 20px;background: linear-gradient(to bottom,rgba(255, …

访问 gitlab 跳转 0.0.0.0

1、检查防火墙是否关闭2、检查服务器端口是否被占用3、检查服务器是否对外开放80端口(gitlab 默认使用80端口)以阿里云服务器为例如果没有SSH 、HTTP、HTTPS 开放,需要增加规则进行添加点击确定即可。