说明:惰性队列是为了解决消息堆积问题,当生产者生产消息的速度远高于消费者消费消息的速度时,消息会大量的堆积在队列中,而队列中存放的消息数量是有限的,当超出数量时,会造成消息的丢失。而扩容队列,实际上不太现实,因为队列的消息是存在内存中的,内存也有上限。
从RabbitMQ 3.6.0版本开始,增加了惰性队列的概念(Lazy Queues),惰性队列在接收到消息后是存到磁盘中,而不是内存,只有当消费者消费消息时,才把消息从磁盘中读取出来,加载到内存中。
使用
@RabbitListener方式
java
@RabbitListener(queuesToDeclare = @Queue(
name = "lazy.queue",
durable = "true",
arguments = @Argument(name="x-queue-mode", value="lazy")
))
public void listenerQueue(String message){
System.out.println("message = " + message);
}
@Bean方式
java
@Bean
public Queue lazyQueue(){
return QueueBuilder
.durable("lazy.queue")
.lazy()
.build();
}
正常队列、惰性队列各自发送10万条消息,观察区别
(正常队列)
(惰性队列)
区别:
-
惰性队列使用的内存量大于正常队列,因为增加了磁盘的写入/读取
-
惰性队列消费消息,速度较正常队列更稳定,当然速度更慢(上面只是偶然情况,大多数情况比正常队列慢)
总结
惰性队列用于解决消息堆积问题