5.3 惰性队列
一、消息堆积问题
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,知道队列存储消息达到上限。最早接收到的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题
解决消息堆积的三种思路
增加更多消费者,提高消费速度
在消费者内开启线程池加快消息处理速度
扩大队列容积,提高堆积上限
二、惰性队列
从RabbitMQ3.0.6版本开始,增加了Lazy Queues的概念,也就是惰性队列
惰性队列的特征:
接收到消息后直接存储入磁盘,而非内存
消费者要消费消息时才会从磁盘中读取,并加载到内存中
支持数百万条的消息存储
设置某个运行中的队列变换为惰性队列
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queue备注:
rabbitmqctl:MQ提供的控制台命令
set_policy:设置规则
Lazy:定义的规则名称
"^lazy-queue$":正则表达式,用来匹配符合条件的队列
'{"queue-mode":"lazy"}':设置称为这个模式(惰性队列模式)
--apply-to queue:作用于所有的队列
声明队列时候直接指定为惰性队列,使用SpringAMQP
基于Bean的方式声明(建议)
@Configuration public class LazyConfig { @Bean public Queue lazyQueue() { return QueueBuilder.durable("lazy.queue") .lazy() .build(); } }备注:同样在消费者声明,这里只声明惰性队列,没有绑定交换机
基于注解方式声明
@RabbitListener(bindings = @QueueBinding( value = @Queue(name = "lazy.queue", durable = "true"), exchange = @Exchange(name = "lazy.direct"), key = "lazy", arguments = @Argument(name = "x-queue-mode", value = "lazy") )) public void listenDlQueue(String msg) { System.out.println("接收到了dl.queue的延迟消息"); }
最后更新于
这有帮助吗?