RabbitMQ惰性队列使用

说明:惰性队列是为了解决消息堆积问题,当生产者生产消息的速度远高于消费者消费消息的速度时,消息会大量的堆积在队列中,而队列中存放的消息数量是有限的,当超出数量时,会造成消息的丢失。而扩容队列,实际上不太现实,因为队列的消息是存在内存中的,内存也有上限。

从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万条消息,观察区别

(正常队列)


(惰性队列)

区别:

  • 惰性队列使用的内存量大于正常队列,因为增加了磁盘的写入/读取

  • 惰性队列消费消息,速度较正常队列更稳定,当然速度更慢(上面只是偶然情况,大多数情况比正常队列慢)

总结

惰性队列用于解决消息堆积问题

相关推荐
czlczl200209256 小时前
XA分布式事务
分布式
笨手笨脚の9 小时前
分布式系统的本质是什么
分布式
czlczl2002092511 小时前
Zookeeper
分布式·zookeeper·云原生
布吉岛的石头11 小时前
分库分表实战:Sharding-JDBC 快速落地
分布式·mysql
晓庆的故事簿16 小时前
JAVA搭配RabbitMQ使用
java·rabbitmq·java-rabbitmq
渔民小镇17 小时前
4 行代码接入 Spring —— ionet 的生态融合之道
java·服务器·分布式·游戏
苍煜17 小时前
Kafka vs RocketMQ 生产环境选型指南
分布式·kafka·rocketmq
m0_7162550018 小时前
第二部分 电商离线数仓 全套项目代码(可直接在你伪分布式 Hive 运行)
hive·hadoop·分布式
旷世奇才李先生19 小时前
Spring Cloud Alibaba 2026微服务全栈实战:服务治理\+流量控制\+分布式事务
分布式·微服务·架构
Amy1870211182319 小时前
虚拟电厂为什么必须“牵手”微电网?答案全在这里
分布式·安全·能源