做图书馆网站,平面设计基础学什么,如何在百度推广网站,十大微商推广平台在默认情况下#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。但在某些特殊情况下#xff0c;这会导致消息积压#xff0c;比如#xff1a;
消费者宕机或出现网络故障消息发送量激增#xff0c;超过了消费者处理速度消费者处理业务发生阻塞
一旦…在默认情况下RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。但在某些特殊情况下这会导致消息积压比如
消费者宕机或出现网络故障消息发送量激增超过了消费者处理速度消费者处理业务发生阻塞
一旦出现消息堆积问题RabbitMQ的内存占用就会越来越高直到触发内存预警上限。此时RabbitMQ会将内存消息刷到磁盘上这个行为成为PageOut. PageOut会耗费一段时间并且会阻塞队列进程。因此在这个过程中RabbitMQ不会再处理新的消息生产者的所有请求都会被阻塞。
为了解决这个问题从RabbitMQ的3.6.0版本开始就增加了Lazy Queues的模式也就是惰性队列。惰性队列的特征如下
接收到消息后直接存入磁盘而非内存消费者要消费消息时才会从磁盘中读取并加载到内存也就是懒加载支持数百万条的消息存储
而在3.12版本之后LazyQueue已经成为所有队列的默认格式。因此官方推荐升级MQ为3.12版本或者所有队列都设置为LazyQueue模式
1.控制台配置Lazy模式
在添加队列的时候添加x-queue-modlazy参数即可设置队列为Lazy模式
2.代码配置Lazy模式
在利用SpringAMQP声明队列的时候添加x-queue-modlazy参数也可设置队列为Lazy模式
Beanpublic
Queue lazyQueue(){ return QueueBuilder.durable(lazy.queue).lazy() // 开启Lazy模式.build();}这里是通过QueueBuilder的lazy()函数配置Lazy模式底层源码如下 当然我们也可以基于注解来声明队列并设置为Lazy模式 RabbitListener(queuesToDeclare Queue(name lazy.queue,durable true,arguments Argument(name x-queue-mode, value lazy)))public void listenLazyQueue(String msg){log.info(接收到 lazy.queue的消息{}, msg);}3.更新已有队列为lazy模式
对于已经存在的队列也可以配置为lazy模式但是要通过设置policy实现。 可以基于命令行设置policy
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策略的作用对象是所有的队列
当然也可以在控制台配置policy进入在控制台的Admin页面点击Policies即可添加配置