0


RabbitMQ实现延迟队列

延迟队列

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

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

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

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

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

  1. 定时发送消息

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

  1. 秒杀活动的处理

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

TTl和死信队列原理:

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

配置延迟队列:

配置类

  1. //queue5订阅ex5死信交换机的消息
  2. @Bean
  3. public Queue queue5(){
  4. return new Queue("queue5");
  5. }
  6. //死信交换机
  7. @Bean
  8. public DirectExchange ex5(){
  9. return new DirectExchange("ex5");
  10. }
  11. //绑定
  12. @Bean
  13. public Binding bindingQ5Ex5(Queue queue5,DirectExchange ex5){
  14. return BindingBuilder.bind(queue5).to(ex5).with("k5");
  15. }
  16. //定义延迟队列,当queue6里的消息过期后会发送到ex5死信交换机
  17. @Bean
  18. public Queue queue6(){
  19. return QueueBuilder.durable("queue6") //队列的名字
  20. .ttl(10000) //存活时间 单位是毫秒
  21. .deadLetterExchange("ex5") //死信交换机
  22. .deadLetterRoutingKey("k5") //key值
  23. .build();
  24. }
  25. //交换机
  26. @Bean
  27. public DirectExchange ex6(){
  28. return new DirectExchange("ex6");
  29. }
  30. //绑定
  31. @Bean
  32. public Binding bindingQ6Ex6(Queue queue6,DirectExchange ex6){
  33. return BindingBuilder.bind(queue6).to(ex6).with("k6");
  34. }

生产者

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

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

标签: rabbitmq 分布式

本文转载自: https://blog.csdn.net/weixin_58724261/article/details/131527397
版权归原作者 源末coco 所有, 如有侵权,请联系我们删除。

“RabbitMQ实现延迟队列”的评论:

还没有评论