RabbitMQ死信队列、延时队列

死信队列

DLX 全称Dead-Letter-Exchange,称之为死信交换器

当消息变成一个死信之后,如果这个消息所在的队列存在x-dead-letter-exchange参数,

那么它会被发送到x-dead-letter-exchange对应值的交换器上,这个交换器就称之为死信交换器,

与这个死信交换器绑定的队列就是死信队列。

如下情况会被加入到死信队列中

  • 消息被消费方拒绝,使用 channel.basicNackchannel.basicReject, 并且此时 requeue属性被设置为 false
  • 消息在队列的存活时间超过了设置的 TTL 时间,即过期(两种方式设置)了
    • 一、通过对队列进行设置,这种设置后,该队列中所有的消息都存在相同的过期时间
    • 二、通过对消息本身进行设置,那么每条消息的过期时间都不一样
    • 如果同时使用这2种方法,那么以过期时间小的那个数值为准
  • 消息队列的数量已经超过了最大队列长度

延时队列

RabbitMQ 中不存在延时队列,但是我们可以通过设置消息的过期时间和死信队列来模拟出延时队列。

消费者监听死信交换器绑定的队列,而不要监听消息发送的队列。

有了以上的基础知识,我们完成以下需求:

需求:用户在系统中创建一个订单,如果10s后,用户没有进行支付,那么自动取消订单。

分析:

上面这个情况,我们就适合使用延时队列来实现,那么延时队列如何创建

  • 一、为订单消息设置TTL = 10s,或者为订单队列设置TTL = 10s
  • 二、订单如果在 10s 没有被消费,则加入到指定的死信队列中
  • 三、专门处理取消订单的消费者就会来消费这个死信队列

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!