死信队列

590 阅读2分钟

业务场景

平时生活中有许多的超时设计,比如购买车票的时候,就有30分钟的支付时间,如果在30分钟内支付,则正常,反之就去掉该订单。

以前的设计方案:有一个监听订单状态的程序,会在30分钟内进行轮询的查询订单状态,但是这样比较消耗性能

这个时候就可以采用消息队列的一个特效:延迟消息

image.png


延迟消息

延迟消息就是当消息提供者将消息发送到消息队列以后,并不马上推送给消费者,而是等待指定的时间
以后再推送给消费者,从而达到延迟的效果。


通过延迟消息可以解决超时的这种设计,但是rabbitmq没有延迟消息这个特征,但是我们可以通过设置队列的TTL参数进而达到延迟消息的效果

死信队列

死信队列的特征:没有消费者,只有消息提供者,并且设置有超时时间(毫秒)

通过死信队列实现延迟消息方案

1.采用direct模式
2.创建两个队列,一个正常队列,一个死信队列
3.消息提供者将消息发送到死信对象,而消息消费者读另一个队列的消息

具体实现

  • 创建交换机

image.png

  • 创建队列-正常队列

image.png

  • ==创建队列-死信队列== image.png

  • 绑定队列

image.png

  • 代码实现
消息提供者:
rabbitTemplate.convertAndSend("delay_exchange","key1","死信消息发送过来了!!!")
消息消费者:
@Component
@Slf4j
@RabbitListener(bindings = {
        @QueueBinding(
                value = @Queue("queue9"),
                exchange = @Exchange(value = "delay_exchange", type = "direct"),
                key = {"key2"}  //路由参数
        )
})
public class DelayQueueModel {

    @RabbitHandler
    public void msg(String message,Message msg, Channel channel) {
        log.info("接收到的延迟消息,message:{}", message);
        // TODO 这里进行业务处理,处理延迟消息
        try {
            channel.basicAck(msg.getMessageProperties().getDeliveryTag(),false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}