利用 RabbitMQ 实现延时队列

利用 RabbitMQ 实现延时队列

薛定谔的汪

前言

在电商的项目中经常会遇到这种情况:用户下单经过了一定时间后仍未付款,则系统自动取消订单。

如果系统中有 RabbitMQ 的话,利用 RabbitMQ 来实现延时队列的需求是一种不错的选择。在此之前,需要先了解RabbitMQ 的两个概念:消息过期时间 TTL 和死信交换器DLX。

过期时间 TTL

RabbitMQ 可以对消息和队列设置 TTL,目前有两种方法设置。

通过队列属性设置,这样队列中所有消息都有相同的过期时间;

对消息本身进行单独设置,每条消息的 TTL 可以不同;

如果两个方法同时使用,以最小 TTL 为准。

消息在队列中生存时间超过设置的 TTL,就会变成“死信“

DLX

全称为:Dead-Letter-Exchange,死信交换器,当一个消息在队列中变成死信后,会被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就是死信队列。

消息变成死信的情况:

消息被拒绝

消息过期

队列达到最大长度

DLX 其实和正常的交换器没区别,它能在任何队列上被指定。

DLX 是一个非常有用的特性,他可以处理异常情况下,消息不能够被消费者正确消费而被置入死信队列中的情况,后续分析程序可以通过消费这个死信队列中的消息来分析当时遇到的异常情况,进而可以改善和优化系统。

DLX 配合 TTL 使用可以实现延时队列的功能。

延时队列

当生产者发送了一个消息,并不想让消费者立马取到这个消息,而是想让其过一段时间后再进行消费,最常见的就是用户下单指定时间后仍未付款,系统自动取消订单。

RabbitMQ 可以通过 DLX 和 TTL 来实现延时队列。

原理如图所示:

生产者输出消息到 TTL 队列,并且这个消息是设置有有效时间的,比如30分钟。消息会在 TTL 中等待30分钟 ,如果没有消费者收掉的话,它就是被转发到 DLX ,DLX有消费者,收到消息,处理延时任务。

  • Title: 利用 RabbitMQ 实现延时队列
  • Author: 薛定谔的汪
  • Created at : 2018-03-30 21:21:43
  • Updated at : 2023-11-17 19:37:37
  • Link: https://www.zhengyk.cn/2018/03/30/mq/rabbitmq/delay-queue/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
利用 RabbitMQ 实现延时队列