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.队列达到最大长度

延迟队列

概念

延迟队列:指消息发送后,不会被消费者立即获取,而是等待特定时间后才会被消费者消费的队列。

应用场景

  1. 智能家居:用户远程发送指令,让智能设备在指定时间执行,指令先存入延迟队列,时间到后再推送给设备。
  2. 日常管理:预定会议后,在会议开始前 15 分钟自动提醒参会人。
  3. 用户运营:用户注册成功后,7 天后发送短信提升活跃度。

RabbitMQ 实现方式

RabbitMQ 本身不直接支持延迟队列,但可以通过 TTL + 死信队列 组合模拟实现:

  1. 生产者将消息发送到 normal_exchange,路由到 normal_queue(设置 TTL,如 10 秒)。
  2. normal_queue 配置死信交换机(DLX),消息过期后会被转发到死信队列 dlx_queue。
  3. 消费者订阅 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

演示队列:设置了延迟时间的 消息,当控制器发送请求时,按照延迟时间先后到达 延迟队列;

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐