当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。最早接收到的消息,可能会成为死信,会被丢弃。
解决消息堆积三种思路:
- 增加更多消费者,加快消费速度
- 在消费者内开启线程池加快消息处理速度
- 扩大队列容积,提高堆积上限
惰性队列
从RabbitMQ的3.6.0版本开始,增加了Lazy Queues的概念,也就是惰性队列。
惰性队列特征如下:
- 接收到消息后直接存入磁盘而非内存
- 消费者要消费消息时才会从磁盘中读取并加载到内存
- 支持数百万条的消息存储
用SpringAMQP声明惰性队列的方式:
1 2 3 4 5 6
| @Bean public Queue lazyQueue() { return QueueBuilder.durable("lazy.queue") .lazy() .build(); }
|
1 2 3 4 5 6 7 8 9
| @RabbitListener(bindings = @QueueBinding( value = @Queue(name = "lazy.queue", durable = "true", arguments = @Argument(name = "x-queue-mode", value = "lazy")), exchange = @Exchange(name = "lazy.direct"), key = "dl" )) public void listenLazyQueue(String msg){ System.out.println("消费者接收到lazy.queue的消息:【" + msg + "】"); }
|
惰性队列的优点:
- 基于磁盘存储,消息上限更高
- 没有间歇性的page-out,性能比较稳定
缺点:
- 基于磁盘存储,消息时效性会降低
- 性能受限于磁盘的IO