如何实现RabbitMQ的延迟队列

152 阅读2分钟

前言

我们在工作中可能会遇到以下场景:在使用用 RabbitMQ 时,我们需要当发送消息到 RabbitMQ 中后,消费者不要第一时间去处理,以此来产生延迟队列的效果。 例如我们点外卖下单后,并没有着急进行最后一步的付款,但这个时候库存已经减了,如果我们一直不付款的话,30分钟后订单会自动取消,这时库存又会重新恢复。

但是 RabbitMQ 本身是没有延迟队列这个功能的,因此,我们需要借助延时消息,死信,死信队列来实现延迟队列的功能。

死信

什么是死信?死信就是 RabbitMQ 中的一种消息机制。

当消息出现下列情况时就会成为死信:

  • 在队列的存活时间超过设置的TTL时间
  • 消息队列的消息数量已经超过最大队列长度。

死信消息,会被 RabbitMQ 进行特殊处理。

如果配置了死信队列信息,该消息会被自动重新投递到另一个交换机上,这个交换机往往被称为 DLX(dead-letter-exchange) “死信交换机”,然后交换机根据绑定规则转发到对应的队列上,监听该队列就可以被重新消费;
如果没有配置死信队列信息,则该消息将会被丢弃。

基于死信队列实现延迟队列

  1. 给队列发送消息给消息设置一个超时时间,超过这个时间没有被消费掉这个消息就会被认为是死信,这个队列不设置消费方。

  2. 队列中的所有消息,到达超时时间都会成为死信,会被RabbitMQ发送到死信交换器。

  3. 死信交换器中的数据会被RabbitMQ发送到死信队列。

  4. 接收方监听器监听死信队列,这样从里面消费的消息都是超时后的消息,也就是先了延迟队列的功能。