当前位置: 首页 > article >正文

RabbitMQ高级特性-持久性

对于RabbitMQ的可靠性机制

引入:当RabbitMQ服务停掉以后, ⽣产者发送的消息不丢失呢. 默认情况下, RabbitMQ 退出或者由于某种原因崩溃时, 会忽视队列和消息, 除⾮告知他不要这么做。

RabbitMQ的持久化分为三个部分:交换器的持久化、队列的持久化和消息的持久化。

1、交换机持久化
      交换器的持久化是通过在声明交换机时是将durable参数置为true实现的.相当于将交换机的属性在服务器内部保存,当MQ的服务器发⽣意外或关闭之后,重启 RabbitMQ 时不需要重新去建⽴交换机, 交换机会⾃动建⽴,相当于⼀直存在.
      如果交换器不设置持久化, 那么在 RabbitMQ 服务重启之后, 相关的交换机元数据会丢失, 对⼀个⻓期使⽤的交换器来说,建议将其置为持久化的.

ExchangeBuilder.topicExchange(Constant.ACK_EXCHANGE_NAME).durable(true).build()

2、队列持久化
       队列的持久化是通过在声明队列时将 durable 参数置为 true实现的.
       如果队列不设置持久化, 那么在RabbitMQ服务重启之后,该队列就会被删掉, 此时数据也会丢失. (队列没有了, 消息也⽆处可存了)                                                                                                              队列的持久化能保证该队列本⾝的元数据不会因异常情况⽽丢失, 但是并不能保证内部所存储的消息不会丢失. 要确保消息不会丢失, 需要将消息设置为持久化.

持久化:

QueueBuilder.durable(Constant.ACK_QUEUE).build();

非持久化:

QueueBuilder.nonDurable(Constant.ACK_QUEUE).build();

3、消息持久化
       消息实现持久化, 需要把消息的投递模式( MessageProperties 中的 deliveryMode )设置为2,也就是 MessageDeliveryMode.PERSISTENT

public enum MessageDeliveryMode {
NON_PERSISTENT,//⾮持久化
PERSISTENT;//持久化
}

       设置了队列和消息的持久化, 当 RabbitMQ 服务重启之后, 消息依旧存在. 如果只设置队列持久化,重启之后消息会丢失. 如果只设置消息的持久化, 重启之后队列消失, 继⽽消息也丢失. 所以单单设置消息持久化⽽不设置队列的持久化显得毫⽆意义

//⾮持久化信息
channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
//持久化信息
channel.basicPublish("",QUEUE_NAME,
MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes());

测试场景:

1.交换机    持久化(数据不丢失)

                  非持久化(数据丢失)

2.队列        持久化(队列不丢失)

                消息持久化(消息不丢失)

                消息非持久化(消息丢失)

3,队列        非持久化(队列元数据丢失)

                消息持久化(消息丢失)

                消息非持久化(消息丢失)

               


http://www.kler.cn/news/329557.html

相关文章:

  • STM32单片机编程调试常见问题(二) Keil5软件调试中常见的配置问题
  • 【GEE学习第一期】GEE介绍、注册及基本使用
  • Leetcode 3301. Maximize the Total Height of Unique Towers
  • Spring Boot技术栈:打造高效在线商城
  • 【经典机器学习算法】谱聚类算法及其实现(python)
  • 【DirectX sdk 学习使用】
  • DRF笔记
  • Qt --- 常用控件的介绍---Widget属性介绍
  • 如何隐藏Windows10「安全删除硬件」里的USB无线网卡
  • 计算机毕业设计 智能旅游推荐平台的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 【MySQL 06】表的增删查改
  • Word样式的同步与重置
  • Golang | Leetcode Golang题解之第437题路径总和III
  • LeetCode从入门到超凡(四)深入浅出理解贪心算法
  • 使用Electron将vue项目改桌面程序
  • SpringBoot学习笔记(2)
  • 服务器感染了.baxia勒索病毒,如何确保数据文件完整恢复?
  • 通信工程学习:什么是POP3邮局协议版本3
  • 如何使用MethodChannel通信
  • 匈牙利算法模板
  • java项目实现钉钉异常告警实时监控
  • django使用笔记1--快速开始
  • [Linux] Linux 的进程如何调度——Linux的 O(1)进程调度算法
  • [深度学习]循环神经网络RNN
  • ARM 汇编5 数据类型
  • 【HTML5】html5开篇基础(3)
  • 基于AI大模型应用开发有哪几种方式?
  • Python3自带HTTP服务:轻松开启与后台管理
  • 螺狮壳里做道场:老破机搭建的私人数据中心---Centos下docker学习02(yum源切换及docker安装配置)
  • springboot整合Freemarker动态生成JSON