详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

一、分析数据丢失的原因

分析RabbitMQ消息丢失的情况,不妨先看看一条消息从生产者发送到消费者消费的过程:

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

可以看出,一条消息整个过程要经历两次的网络传输:从生产者发送到RabbitMQ服务器,从RabbitMQ服务器发送到消费者

在消费者未消费前存储在队列(Queue)中

所以可以知道,有三个场景下是会发生消息丢失的:

  • 存储在队列中,如果队列没有对消息持久化,RabbitMQ服务器宕机重启会丢失数据。
  • 生产者发送消息到RabbitMQ服务器过程中,RabbitMQ服务器如果宕机停止服务,消息会丢失。
  • 消费者从RabbitMQ服务器获取队列中存储的数据消费,但是消费者程序出错或者宕机而没有正确消费,导致数据丢失。

针对以上三种场景,RabbitMQ提供了三种解决的方式,分别是消息持久化,confirm机制,ACK事务机制。

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

二、消息持久化

RabbitMQ是支持消息持久化的,消息持久化需要设置:Exchange为持久化和Queue持久化,这样当消息发送到RabbitMQ服务器时,消息就会持久化。

首先看Exchange交换机的类图:

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

看这个类图其实是要说明上一篇文章介绍的四种交换机都是AbstractExchange抽象类的子类,所以根据java的特性,创建子类的实例会先调用父类的构造器,父类也就是AbstractExchange的构造器是怎么样的呢?

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

从上面的注释可以看到durable参数表示是否持久化。默认是持久化(true)。创建持久化的Exchange可以这样写:

	@Bean
    public DirectExchange rabbitmqDemoDirectExchange() {
        //Direct交换机
        return new DirectExchange(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, true, false);
    }
复制代码

接着是Queue队列,我们先看看Queue的构造器是怎么样的:

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

也是通过durable参数设置是否持久化,默认是true。所以创建时可以不指定:

	@Bean
    public Queue fanoutExchangeQueueA() {
    	//只需要指定名称,默认是持久化的
        return new Queue(RabbitMQConfig.FANOUT_EXCHANGE_QUEUE_TOPIC_A);
    }
复制代码

这就完成了消息持久化的设置,接下来启动项目,发送几条消息,我们可以看到:

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

怎么证明是已经持久化了呢,实际上可以找到对应的文件:

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

找到对应磁盘中的目录:

详细讲解!RabbitMQ如何防止数据丢失,看这篇就够了

 

消息持久化可以防止消息在RabbitMQ Server中不会因为宕机重启而丢失

三、

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值