RabbitMQ 架构和工作原理?RabbitMQ 延迟队列如何实现?

一、RabbitMQ 架构和工作原理

1. 先把 RabbitMQ 想成"寄快递"

在 RabbitMQ 里:

  • Producer:寄快递的人

  • Consumer:收快递 / 处理快递的人

  • Queue:快递柜

  • Exchange:分拣中心

  • RoutingKey:快递单上的地址标签

  • Broker:整个 RabbitMQ 服务器

2. 为什么 RabbitMQ 里有 Exchange,不直接发给 Queue?

这是 RabbitMQ 最核心的点。

很多人一开始以为:

生产者直接把消息发到队列

其实不是。

RabbitMQ 的真实流程是:

生产者先把消息发给 Exchange,Exchange 再决定把消息丢到哪个 Queue。

你可以把它理解成:

  • 你寄快递,不是直接塞到收件人的柜子里

  • 而是先到"分拣中心"

  • 分拣中心根据地址,再分发到不同快递柜

所以:

  • Exchange = 分拣中心

  • Queue = 快递柜

3. RabbitMQ 的完整工作流程

第一步:生产者发消息

比如订单系统发一条消息:

"订单 1001 已支付"

这条消息先发给 Exchange。

第二步:Exchange 根据规则分发

Exchange 会看这条消息的 RoutingKey,比如:

复制代码
order.pay

然后根据绑定规则,判断应该把消息发到哪个 Queue。

第三步:消息进入 Queue

消息进入具体队列后,就在里面等着。

这就像快递已经放进快递柜,等人来取。

第四步:消费者消费消息

Consumer 监听这个 Queue,拿到消息后执行业务逻辑。

比如:

  • 扣库存

  • 发优惠券

  • 发短信

  • 更新订单状态

二、Exchange 有哪几种类型

1. Direct Exchange(直连)

像"精确匹配"。

比如:

  • 消息 RoutingKey 是 order.pay

  • 只有绑定了 order.pay 的队列才能收到

就像:

快递单写哪个柜子,就进哪个柜子

2. Topic Exchange(主题)

像"模糊匹配"。

比如:

  • order.*

  • #.pay

适合做按业务类型分类。

就像:

地址里只要符合某种规则,就能分过去

3. Fanout Exchange(广播)

不看 RoutingKey,直接发给所有绑定的队列。

就像:

一条广播消息,所有订阅者都收到

适合:

  • 数据分发

  • 广播通知

  • 一条消息多个系统都要处理

三、RabbitMQ 工作原理,你用一句话怎么记

生产者不是直接发给队列,而是先发给 Exchange,再由 Exchange 按规则路由到 Queue,最后由消费者消费。

四、RabbitMQ 延迟队列怎么理解

你把延迟队列理解成:

不是消息一到就立刻消费,而是先"放一会儿",等时间到了再处理。

比如:

  • 订单 30 分钟未支付自动取消

  • 用户下单 10 分钟后发送提醒

  • 预约任务到时间执行

这些都属于"延迟处理"。

五、延迟队列最常见的实现思路

RabbitMQ 里常见有两种理解方式:

方式1:TTL + 死信队列

你可以这样理解:

先把消息放进一个"临时等待区",

等它过期后,再扔到真正处理的队列里。

流程是这样:

第一步:消息先进入普通队列

这个队列设置了 TTL,比如 30 分钟。

意思是:

消息先在这里躺 30 分钟

第二步:30 分钟后消息过期

过期后,这条消息不能再留在原队列里了。

第三步:变成死信

RabbitMQ 会把它丢到配置好的死信交换机。

第四步:死信交换机再把它路由到目标消费队列

消费者监听这个真正的队列,拿到消息后执行业务。

这个方案像什么?

像你先把快递放进"暂存柜":

  • 到点前不能取

  • 到点后自动转到正式柜子

  • 收件人再去正式柜子拿

方式2:RabbitMQ 延迟插件

用了延迟插件后,可以直接告诉 RabbitMQ:

这条消息 10 分钟后再投递。

也就是说,不需要自己绕"TTL + 死信"那一圈。

流程变成:

  • 生产者发消息时指定延迟时间

  • RabbitMQ 先帮你保管

  • 到时间后再投递到目标队列

  • 消费者再消费

六、TTL + 死信 和 延迟插件的区别

TTL + 死信

像"先放仓库,过期后再转运"

延迟插件

像"直接预约未来某个时间送达"

谁更方便?

一般来说:

  • 延迟插件更直接

  • TTL + 死信更经典、更常见于老方案

七、面试回答版:RabbitMQ 架构和工作原理?

RabbitMQ 的核心架构包括 Producer、Exchange、Queue 和 Consumer。

生产者发送消息时,并不是直接发给队列,而是先发给 Exchange;Exchange 再根据 RoutingKey 和绑定关系,把消息路由到对应的 Queue;最后消费者从 Queue 中获取消息并处理。所以 RabbitMQ 本质上就是"生产者发给交换机,交换机分发到队列,消费者从队列消费"。常见的 Exchange 类型有 Direct、Topic 和 Fanout,分别适合精确路由、主题匹配和广播分发。

八、面试回答版:RabbitMQ 延迟队列

RabbitMQ 延迟队列的核心思想是让消息不要立刻被消费,而是在指定时间后再处理。

常见实现方式有两种:

一种是 TTL 加死信队列,先让消息进入一个设置了过期时间的队列,过期后变成死信,再转发到真正的消费队列;

另一种是使用 RabbitMQ 延迟插件,发送消息时直接指定延迟时间,到时间后 RabbitMQ 再把消息投递给消费者。

实际场景里,像订单超时未支付自动取消、定时通知、延迟重试这些需求,通常都会用到延迟队列。

相关推荐
子非鱼@Itfuture2 小时前
try-catch和try-with-resources区别是什么?try{}catch(){}和try(){}catch(){}有什么好处?
java·开发语言
国冶机电安装2 小时前
分布式控制系统(DCS)安装:从方案设计到投运验收的完整指南
分布式
Nyarlathotep01132 小时前
线程创建和Thread类
java
阿波罗尼亚2 小时前
JDK17 新特性
java
独自破碎E2 小时前
【面试真题拆解】Spring事务机制
java·spring·面试
我是咸鱼不闲呀2 小时前
力扣Hot100系列21(Java)——[多维动态规划]总结(不同路径,最小路径和,最长回文子串,最长公共子序列, 编辑距离)
java·leetcode·动态规划
lihao lihao2 小时前
二分查找
java·数据结构·算法
Albert Edison2 小时前
【C++11】可变参数模板
java·开发语言·c++
代码栈上的思考2 小时前
消息队列持久化:文件存储设计与实现全解析
java·前端·算法