RabbitMQ实现延迟队列

延迟队列

RabbitMQ 延迟队列是指将消息先放入队列中,但是并不立即消费该消息,而是在一定时间后再进行消费的队列。延迟队列可以用来解决某些需要经过一段时间才能处理的任务,例如超时未支付订单的关闭、定时发送消息等场景。

在 RabbitMQ 中实现延迟队列有多种方法,比如使用 RabbitMQ 自带的插件 rabbitmq_delayed_message_exchange,或者结合 TTL 和死信队列来实现。

延迟队列的应用场景比较广泛,以下是几个典型的场景:

  1. 超时未支付订单的关闭

在某些电商网站中,如果用户下单后一段时间内没有完成支付,系统会自动取消该订单。这种场景可以使用延迟队列来实现。当用户下单时,系统将该订单的信息发送到延迟队列中,设置一定的延迟时间,如果在延迟期间用户还未支付,则系统自动关闭该订单。

  1. 定时发送消息

在某些场景下,需要在一定时间后向用户发送消息,比如提醒用户进行缴费、发送定期报告等。这种场景可以使用延迟队列,将消息先存储在队列中,设置一定的延迟时间,到达指定的时间后再将消息发送给用户。

  1. 秒杀活动的处理

在秒杀活动中,大量用户同时抢购某种商品,如果系统一下子将所有订单信息发送给 RabbitMQ,可能会导致系统瘫痪。这时可以使用延迟队列,设置一定的延迟时间,逐步将订单信息发送到 RabbitMQ 中,避免一次性突发的流量压垮系统。

TTl和死信队列原理:

在 RabbitMQ 中,可以为队列设置 TTL。当消息达到设置的 TTL 时,RabbitMQ 会自动将其标记为过期并从队列中删除,并添加到死信交换机DLX中,死信交换机和普通交换机没有区别,它会将私信发送到私信队列中,消费者只需要消费死信队列中的消息。

配置延迟队列:

配置类

//queue5订阅ex5死信交换机的消息
@Bean
public Queue queue5(){
    return new Queue("queue5");
}

//死信交换机
@Bean
public DirectExchange ex5(){
    return new DirectExchange("ex5");
}
//绑定
@Bean
public Binding bindingQ5Ex5(Queue queue5,DirectExchange ex5){
    return BindingBuilder.bind(queue5).to(ex5).with("k5");
}


//定义延迟队列,当queue6里的消息过期后会发送到ex5死信交换机
@Bean
public Queue queue6(){
    return QueueBuilder.durable("queue6")   //队列的名字
            .ttl(10000)  //存活时间  单位是毫秒
            .deadLetterExchange("ex5")  //死信交换机
            .deadLetterRoutingKey("k5") //key值
            .build();
}
//交换机
@Bean
public DirectExchange ex6(){
    return new DirectExchange("ex6");
}
//绑定
@Bean
public Binding bindingQ6Ex6(Queue queue6,DirectExchange ex6){
    return BindingBuilder.bind(queue6).to(ex6).with("k6");
}

生产者

//延迟队列使用
@GetMapping("/test4")
public String sendMSG4(){
    amqpTemplate.convertAndSend("ex6","k6","发送到ex6交换机的消息,对应的队列为queue6");
    return "发送成功";
}

消费者只需要消费queue5中的消息即可

你可能感兴趣的:(rabbitmq,分布式)