RabbitMQ 持久化

交换机持久化

交换器的持久化是通过在声明交换机时是将durable参数置为true实现的.相当于将交换机的属性在服务器内部保存,当MQ的服务器发生意外或关闭之后,重启RabbitMQ时不需要重新去建立交换机,交换机会自动建立,相当于一直存在。

如果交换器不设置持久化,那么在RabbitMQ服务重启之后,相关的交换机元数据会丢失,对一个长期使用的交换器来说,建议将其置为持久化的.

java 复制代码
    //声明交换机
    @Bean("durableExchange")
    public Exchange durableExchange() {
        return ExchangeBuilder.directExchange(MQConstants.DURABLE_EXCHANGE).durable(true).build();
    }

    //声明交换机
    @Bean("durableExchange2")
    public Exchange durableExchange2() {
        return ExchangeBuilder.directExchange(MQConstants.DURABLE_EXCHANGE).durable(false).build();
    }

通过durable 赋值 true(持久化), false (非持久化) 来设置

队列持久化

如果队列不设置持久化,那么在RabbitMQ服务重启之后,该队列就会被删掉,此时数据也会丢失.(队列没有了,消息也无处可存了)

队列的持久化能保证该队列本身的元数据不会因异常情况而丢失,但是并不能保证内部所存储的消息不会丢失,要确保消息不会丢失,需要将消息设置为持久化.

java 复制代码
    //声明队列
    @Bean("durableQueue1")
    public Queue durableQueue() {
        return QueueBuilder.durable(MQConstants.DURABLE_QUEUE).build();
    }
    
    @Bean("durableQueue2")
    public Queue durableQueue2() {
        return QueueBuilder.nonDurable(MQConstants.DURABLE_QUEUE).build();
    }

通过 durable() 设置队列的持久性,nonDurable() 就是设置不持久化的队列

消息持久化

消息的持久化就是当rabbitmq 服务器发生崩溃的时候,在重启之后依旧能看到我们发送过的消息,这就是消息的持久化,消息持久化的前提是队列的持久化,如果队列不持久化,只是设置消息的持久化是没有任何作用的,因为承载消息的容器【队列】都消失了,那消息也会跟着消失

首先确保队列持久化:

java 复制代码
    //声明队列
    @Bean("durableQueue1")
    public Queue durableQueue() {
        return QueueBuilder.durable(MQConstants.DURABLE_QUEUE).build();
    }

设置消息的持久化:

NON_PERSISTENT 是非持久化,PERSISTENT是持久化

如果我们需要设置消息的持久化就需要设置PERSISTENT

通过给消息的属性赋值messageObject.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);

java 复制代码
    @RequestMapping("/durable")
    public String durable() {
        for (int i = 0; i < 10; i++) {
            String message = "durable: " + i;
            Message messageObject = new Message(message.getBytes(), new MessageProperties());
            //设置发送的消息为持久化
         	messageObject.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
            rabbitTemplate.convertAndSend(MQConstants.DURABLE_EXCHANGE, MQConstants.DURABLE_ROUTING_KEY, messageObject);
        }
        return "消息发送成功";
    }

注意:

**消息的持久化是需要通过 rabbitmq 调用linux 内核将消息落入磁盘中实现的,因此消息的持久化会降低我们的rabbitmq 的性能,**如果不要求消息的持久化的场景中,我们尽量不要设置消息的持久化,虽然不是每条消息一到队列就进行持久化,而是使用批量持久化,当消息达到一定数量的时候,我们才进行落盘操作,但还是会降低性能

相关推荐
AC赳赳老秦2 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
invicinble1 天前
关于Rabbitmq在逻辑主体层面的配置
spring boot·rabbitmq·java-rabbitmq
I_Jln.1 天前
RabbitMQ+SpringAMQP 从入门到精通
分布式·rabbitmq
编程彩机2 天前
互联网大厂Java面试:从Spring Boot到消息队列的技术场景解析
java·spring boot·分布式·面试·kafka·消息队列·rabbitmq
洛阳纸贵2 天前
JAVA高级工程师--RabbitMQ消费者消息限流、超时、死信队列以及若依集成升级
java·rabbitmq·java-rabbitmq
福赖2 天前
《微服务即使通讯中RabbitMQ的作用》
c++·微服务·架构·rabbitmq
h7ml3 天前
基于 RabbitMQ 构建异步化淘客订单处理流水线:解耦、削峰与失败重试
分布式·rabbitmq·ruby
小北方城市网4 天前
Spring Boot Actuator+Prometheus+Grafana 生产级监控体系搭建
java·spring boot·python·rabbitmq·java-rabbitmq·grafana·prometheus
不想写bug呀5 天前
RabbitMQ集群和仲裁队列
rabbitmq·集群·仲裁队列
信创天地5 天前
国产化数据库深度运维:性能调优与故障排查实战指南
运维·数据库·安全·elk·自动化·rabbitmq