十二、RabbitMQ高级 - 惰性队列

简介: 十二、RabbitMQ高级 - 惰性队列

1. 消息堆积问题


当生产者 发送消息的速度 超过了 消费者 处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。



解决消息堆积有两种思路


  • 增加更多消费者,提高消费速度。也就是我们之前说的 work queue 模式


  • 扩大队列容积,提高堆积上限


要提升队列容积,把消息保存在内存中显然是不行的。


2. 惰性队列


RabbitMQ 的 3.6.0 版本开始,就增加了 Lazy Queues 的概念,也就是惰性队列。惰性队列的特征如下:


  • 接收到消息后直接存入磁盘而非内存


  • 消费者要消费消息时才会从磁盘中读取并加载到内存


  • 支持数百万条的消息存储


2.1 基于命令行设置 lazy-queue


而要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可。可以通过命令行将一个运行中的队列修改为惰性队列:


rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues


命令解读:


  • rabbitmqctl :RabbitMQ的命令行工具


  • set_policy :添加一个策略


  • Lazy :策略名称,可以自定义


  • “^lazy-queue$” :用正则表达式匹配队列的名字


  • ‘{“queue-mode”:“lazy”}’ :设置队列模式为lazy模式


  • –apply-to queues:策略的作用对象,是所有的队列


2.2 基于 @Bean 声明 lazy-queue


@Bean
piblic Queue lazyQueue(){
    return QueueBuilder
            .durable("lazy.queue")
            .lazy() //  开启x-queue-mode为lazy
            .build();
}


2.3 基于 @RabbitListener声明 LazyQueue


@RabbitListener(queuesToDeclare = @Queue(
    name = "lazy.queue",
    durable = "true",
    arguments = @Argument(name = "x-queue-mode", value = "lazy")
))
public void listenLazyQueue(String name){
    log.info("接收到 lazy.queue 的消息:{}", msg);
} 


3. 总结


消息堆积问题的解决方案?


  • 队列上绑定多个消费者,提高消费速度


  • 使用惰性队列,可以再mq中保存更多消息


惰性队列的优点有哪些?


  • 基于磁盘存储,消息上限高


  • 没有间歇性的page-out,性能比较稳定


惰性队列的缺点有哪些?


  • 基于磁盘存储,消息时效性会降低


  • 性能受限于磁盘的IO
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 存储 监控
RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察
RabbitMQ 是一个功能强大的消息代理,用于分布式应用程序间的通信。它通过队列临时存储消息,支持异步通信和解耦。经典队列适合高吞吐量和低延迟场景,而仲裁队列则提供高可用性和容错能力,适用于关键任务系统。选择哪种队列取决于性能、持久性和容错性的需求。
120 6
|
2月前
|
消息中间件 JSON Java
|
2月前
|
消息中间件
rabbitmq,&队列
rabbitmq,&队列
|
2月前
|
消息中间件 JSON Java
玩转RabbitMQ声明队列交换机、消息转换器
玩转RabbitMQ声明队列交换机、消息转换器
84 0
|
3月前
|
消息中间件 存储 NoSQL
MQ的顺序性保证:顺序队列、消息编号、分布式锁,一文全掌握!
【8月更文挑战第24天】消息队列(MQ)是分布式系统的关键组件,用于实现系统解耦、提升可扩展性和可用性。保证消息顺序性是其重要挑战之一。本文介绍三种常用策略:顺序队列、消息编号与分布式锁,通过示例展示如何确保消息按需排序。这些方法各有优势,可根据实际场景灵活选用。提供的Java示例有助于加深理解与实践应用。
84 2
|
4月前
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
|
4月前
|
消息中间件 Java Kafka
说说RabbitMQ延迟队列实现原理?
说说RabbitMQ延迟队列实现原理?
67 0
说说RabbitMQ延迟队列实现原理?
|
4月前
|
消息中间件 NoSQL 关系型数据库
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
129 1
|
5月前
|
消息中间件
RabbitMQ配置单活模式队列
RabbitMQ配置单活模式队列
137 0
|
5月前
|
消息中间件 数据库
03.RabbitMQ延迟队列
03.RabbitMQ延迟队列
48 0