12、RabbitMQ基础:惰性队列

有道无术,术尚可求,有术无道,止于术。

文章目录

    • 前言
  • 设置为惰性队列
  • 内存开销对比

前言

默认情况下,当生产者将消息发送到 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

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: