有道无术,术尚可求,有术无道,止于术。
文章目录
- 前言
- 设置为惰性队列
- 内存开销对比
前言
默认情况下,当生产者将消息发送到 RabbitMQ
的时候,队列中的消息会尽可能的存储在内存之中,这样可以更加快速的将消息发送给消费者。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份。
当RabbitMQ
需要释放内存的时候,会将内存中的消息换页至磁盘中,这个操作会耗费较长的时间,也会阻塞队列的操作,进而无法接收新的消息。虽然RabbitMQ
的开发者们一直在升级相关的算法,但是效果始终不太理想,尤其是在消息量特别大的时候。
RabbitMQ
从3.6.0版本开始引入了惰性队列
的概念。
惰性队列
会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致使长时间内不能消费消息造成堆积时,惰性队列就很有必要了。
设置为惰性队列
队列具备两种模式:
- default
- lazy
默认为default
模式。lazy
模式即为惰性队列
模式。
可以在控制台上直接添加队列,并指定其模式为lazy
:
可以使用参数x-queue-mode
设置:
@Bean("lazy_queue888")
public Queue bootQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-queue-mode", "lazy");
return QueueBuilder.durable("lazy_queue888").withArguments(args).deadLetterExchange(DEAD_EXCHANGE).deadLetterRoutingKey(DEAD_ROUTE_KEY).build();
}
或者使用lazy()
方法设置:
@Bean("lazy_queue999")
public Queue lazy_queue999() {
return QueueBuilder.durable("lazy_queue999").lazy().deadLetterExchange(DEAD_EXCHANGE).deadLetterRoutingKey(DEAD_ROUTE_KEY).build();
}
内存开销对比
在发送 1 百万条消息,每条消息大概占 1KB 的情况下,普通队列占用内存是 1.2GB,而惰性队列仅仅占用 1.5MB。