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

(正常队列)


(惰性队列)

区别:

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

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

总结

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

相关推荐
老陈说编程15 小时前
1. 鸿蒙 (HarmonyOS) 2012 至 2026 年的发展历程
分布式·华为·个人开发·harmonyos·鸿蒙·鸿蒙系统·程序员创富
xxwl5851 天前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
ly76893 天前
Redis 分布式锁的边界条件:Redlock 争议、锁续期与客户端崩溃后的互斥失效
数据库·redis·分布式·分布式锁·watchdog·redlock
灯澜忆梦3 天前
【minio】#5 | MinIO 分布式部署 + HTTPS 部署
分布式·网络协议·https·对象存储·minio
谢亮_vipxieliang3 天前
Spring Cloud 服务治理入门:注册发现、配置中心、网关限流、熔断降级与分布式一致性方案
分布式·spring·spring cloud
樱花落木兰3 天前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
ShineWinsu3 天前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
Flynt4 天前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
JosieBook4 天前
【数据库】MySQL 实战精通系列 · 第10篇:分库分表与分布式事务实战
数据库·分布式·mysql