RabbitMQ TTL+死信+延迟队列
TTL
过期时间,消息的寿命,存活时间
当消息到达设置的过期时间还没有被消费掉,就会被清除掉
设置消息的TTL
1.设置队列的TTL(存在该队列中的所有消息的TTL)
2.设置消息的TTL
当队列和消息都设置了TTL,那么将取其中的 最小值;
使用场景:例如下单后未付款的场景,商家审核;

1.设置消息的TTL

一旦消息的 ttl 到达,消息进入一个 “等待清理”状态
2.设置队列 TTL
![]()

一旦队列的 ttl 到达,队列中的消息统一进入一个 “等待清理”状态
3.同时设置ttl
取两者最短时间;
场景:如果此时 有一条 ttl 为 20s 的消息先到达队列,ttl为 10s 的消息后到达队列,此时会出现什么情况?
由于 队列 ”先进先出“原则:
- 前 10s:消息 B 虽然已经过期,但因为排在消息 A 后面,RabbitMQ 不会主动把它移到死信队列;
- 第 20s:消息 A 过期,RabbitMQ 扫描队列头部时,才会发现消息 A 和已经过期的消息 B,两条消息同时被移
解决方法:使用 RabbitMQ 延迟插件
=======================================================================
死信队列
无法被消费的信息,就是死信;
当消息在一个队列中变成私信后,就能被i重新发送到另一个交换机中,这个交换机叫做
“DLX”,绑定DLX的队列,就称为“死信队列(DLQ)”

消息变成死信一般是以下几种情况:
1)消息被拒绝
消费者使用 Basic.Reject 或 Basic.Nack 拒绝消息,并且设置 requeue=false(不重新入队)。
2)消息过期
消息的 TTL(Time To Live)到期,未被消费。
3)队列达到最大长度
队列满了,新消息入队时触发 “先进先出” 淘汰,最早的消息被挤成死信。
代码
声明队列/交换机

1.消息被拒绝

2.消息过期
当消息在正常队列中存在 10s,就会发送到死信交换机;

3.队列达到最大长度

延迟队列
概念
延迟队列:指消息发送后,不会被消费者立即获取,而是等待特定时间后才会被消费者消费的队列。
应用场景
- 智能家居:用户远程发送指令,让智能设备在指定时间执行,指令先存入延迟队列,时间到后再推送给设备。
- 日常管理:预定会议后,在会议开始前 15 分钟自动提醒参会人。
- 用户运营:用户注册成功后,7 天后发送短信提升活跃度。
RabbitMQ 实现方式
RabbitMQ 本身不直接支持延迟队列,但可以通过 TTL + 死信队列 组合模拟实现:
- 生产者将消息发送到 normal_exchange,路由到 normal_queue(设置 TTL,如 10 秒)。
- normal_queue 配置死信交换机(DLX),消息过期后会被转发到死信队列 dlx_queue。
- 消费者订阅 dlx_queue,从而消费到延迟 10 秒的消息。

代码实现
1.设置队列的 TTL

2.设置消息的 TTL
由于 队列 ”先进先出“原则,先发送 20s 的消息,在发送 10s 的消息,那么 10s 的消息会在 20s消息 过期后才处理;
引入了 延迟队列插件的方式
---------------------------------------------------------------------------------------------------------------------------------
延迟队列插件
官网查看资料安装
https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq
安装
1.找到rabbitmq目录下,新建 plugins 文件

2.下载lrzsz 工具
通过 ZMODEM 协议在本地和服务器之间传输文件通过 ZMODEM 协议在本地和服务器之间传输文件
命令:apt install lrzsz
3.拖动插件到 终端 窗口
![]()

安装完成
4.查看插件

此时插件就在这个目录下;
5.启动插件
命令:rabbitmq-plugins enable rabbitmq_delayed_message_exchange

6.重启服务
命令:service rabbitmq-server restart

=========================================================================
基于插件实现延迟队列
代码



工作流程
死信队列 + ttl:设置了 ttl 的消息,当控制器发送请求时,按照 消息发送顺序 到达队列,在死信队列内执行 ttl
演示队列:设置了延迟时间的 消息,当控制器发送请求时,按照延迟时间先后到达 延迟队列;
更多推荐

所有评论(0)