5.3 惰性队列

一、消息堆积问题

  1. 当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,知道队列存储消息达到上限。最早接收到的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题

  2. 解决消息堆积的三种思路

    1. 增加更多消费者,提高消费速度

    2. 在消费者内开启线程池加快消息处理速度

    3. 扩大队列容积,提高堆积上限

二、惰性队列

  1. 从RabbitMQ3.0.6版本开始,增加了Lazy Queues的概念,也就是惰性队列

  2. 惰性队列的特征:

    1. 接收到消息后直接存储入磁盘,而非内存

    2. 消费者要消费消息时才会从磁盘中读取,并加载到内存中

    3. 支持数百万条的消息存储

  3. 设置某个运行中的队列变换为惰性队列

    rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queue

    备注:

    ​ rabbitmqctl:MQ提供的控制台命令

    ​ set_policy:设置规则

    ​ Lazy:定义的规则名称

    ​ "^lazy-queue$":正则表达式,用来匹配符合条件的队列

    ​ '{"queue-mode":"lazy"}':设置称为这个模式(惰性队列模式)

    ​ --apply-to queue:作用于所有的队列

  4. 声明队列时候直接指定为惰性队列,使用SpringAMQP

    1. 基于Bean的方式声明(建议)

      @Configuration
      public class LazyConfig {
          
          @Bean
          public Queue lazyQueue() {
              return QueueBuilder.durable("lazy.queue")
                      .lazy()
                      .build();
          }
          
      }

      备注:同样在消费者声明,这里只声明惰性队列,没有绑定交换机

    2. 基于注解方式声明

          @RabbitListener(bindings = @QueueBinding(
                  value = @Queue(name = "lazy.queue", durable = "true"),
                  exchange = @Exchange(name = "lazy.direct"),
                  key = "lazy",
                  arguments = @Argument(name = "x-queue-mode", value = "lazy")
          ))
          public void listenDlQueue(String msg) {
              System.out.println("接收到了dl.queue的延迟消息");
          }

最后更新于

这有帮助吗?