MQ的可靠性
在默认情况下,RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。这样会导致两个问题:
-
一旦MQ宕机,内存中的消息会丢失
-
内存空间有限,当消费者故障或处理过慢时,会导致消息积压,引发MQ阻塞。
数据持久化
RabbitMQ实现数据持久化包括3个方面: -
交换机持久化
-
队列持久化
-
消息持久化
Lazy Queue
从RabbitMQ的3.6.0版本开始,就增加了LazyQueue的概念,也就是惰性队列。惰性队列的特征如下: -
接收到消息后直接存入磁盘,不再存储到内存
-
消费者要消费消息时才会从磁盘中读取并加载到内存(可以提前缓存部分消息到内存,最多2048条)
-
在3.12版本后,所有队列都是Lazy Queue式,无法更改。
代码方式
要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可:
@Bean
public Queue lazyQueue(){
return QueueBuilder
.durable("lazy.queue")
.lazy()
.build();
}
==================注解方式=============================================
@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);
}
RabbitMQ如何保证消息的可靠性
- 首先通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MO重启消息依然存在。
- RabbitMO在3.6版本引入了LazyQueue,并且在3.12版本后会称为队列的默认模式。LazyQueue会将所有消息都持久化。
- 开启持久化和生产者确认时,RabbitM0只有在消息持久化完成后才会给生产者返回ACK回执