侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

RabbitMQ实现延迟队列

再见理想
2022-05-27 / 0 评论 / 0 点赞 / 371 阅读 / 671 字

一,过期时间

RabbitMQ 可以对消息和队列设置 TTL。消息在队列的生存时间一旦超过设置的 TTL 值,就称为 dead message 被投递到死信队列, 消费者将无法再收到该消息。

目前有两种方法可以设置。
1,第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
2,第二种方法是对消息进行单独设置,每条消息TTL可以不同。

二,死信队列

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

DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属性。

要想使用死信队列,只需要在定义队列的时候设置队列参数 x-dead-letter-exchange 指定交换机即可。

消息可能变成死信的原因:

  • 消息被拒绝;
  • 消息过期;
  • 队列达到最大长度;

三,延迟队列

延迟队列存储的对象是对应的延迟消息;所谓“延迟消息” 是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
实现: 过期时间+死信队列

在上图中,分别设置了两个5秒、10秒的过期队列,然后等到时间到了则会自动将这些消息转移投递到对应的死信队列中,然后消费者再从这些死信队列接收消息就可以实现消息的延迟接收。

四,应用场景

场景1

在电商项目中的支付场景;如果在用户下单之后的几十分钟内没有支付成功;那么这个支付的订单算是支付失败,要进行支付失败的异常处理(将库存加回去),这时候可以通过使用延迟队列来处理。

场景2

在系统中如有需要在指定的某个时间之后执行的任务都可以通过延迟队列处理。

0

评论区