RabbitMQ:MQ的可靠性

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回执
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值