延迟队列
RabbitMQ 延迟队列是指将消息先放入队列中,但是并不立即消费该消息,而是在一定时间后再进行消费的队列。延迟队列可以用来解决某些需要经过一段时间才能处理的任务,例如超时未支付订单的关闭、定时发送消息等场景。
在 RabbitMQ 中实现延迟队列有多种方法,比如使用 RabbitMQ 自带的插件 rabbitmq_delayed_message_exchange,或者结合 TTL 和死信队列来实现。
延迟队列的应用场景比较广泛,以下是几个典型的场景:
- 超时未支付订单的关闭
在某些电商网站中,如果用户下单后一段时间内没有完成支付,系统会自动取消该订单。这种场景可以使用延迟队列来实现。当用户下单时,系统将该订单的信息发送到延迟队列中,设置一定的延迟时间,如果在延迟期间用户还未支付,则系统自动关闭该订单。
- 定时发送消息
在某些场景下,需要在一定时间后向用户发送消息,比如提醒用户进行缴费、发送定期报告等。这种场景可以使用延迟队列,将消息先存储在队列中,设置一定的延迟时间,到达指定的时间后再将消息发送给用户。
- 秒杀活动的处理
在秒杀活动中,大量用户同时抢购某种商品,如果系统一下子将所有订单信息发送给 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中的消息即可
版权归原作者 源末coco 所有, 如有侵权,请联系我们删除。