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

RabbitMQ 高级特性之持久性

1. 简介

在 RabbitMQ 的消息发送流程中,一共有三种消息丢失的情况:

  1. 生产者给 broker 发送的消息,broker 没有收到
  2. broker 将消息丢失
  3. broker 给消费者发送消息时消息丢失

对于第一种情况,我们可以使用 RabbitMQ 提供的发布确认模式;

对于第三种情况,我们可以使用 RabbitMQ 的发布确认特性;

对于第二种情况,我们可以使用 RabbitMQ 的持久化特性。

2. 什么是持久化特性

RabbitMQ 的持久化表示的是资源存储在硬盘中,当 RabbitMQ 服务器重启后,设置为持久化的资源不会被释放,除非手动删除,不然不会丢失。

RabbitMQ 的持久化特性分为:

  • 交换机持久化
  • 队列持久化
  • 消息持久化

3. 交换机持久化

在 spring 中,我们声明交换机时,可以为交换机指定是否持久化。

声明持久化交换机:

    //写法一  @Bean("persExchange")public DirectExchange persExchange() {return ExchangeBuilder.directExchange(Constants.PRES_EXCHANGE).build();}//写法二@Bean("persExchange")public DirectExchange persExchange() {return ExchangeBuilder.directExchange(Constants.PRES_EXCHANGE).durable(true).build();}

在写法一中,没有指定 durable 参数,那么默认就会声明一个持久化交换机。

声明非持久化交换机:

    @Bean("notPersExchange")public DirectExchange notPersExchange() {return ExchangeBuilder.directExchange(Constants.NOT_PERS_EXCHANGE).durable(false).build();}

将 durable 参数设置为 false,就会声明一个非持久化交换机。

4. 队列持久化

我们也可以为队列指定是否持久化。

声明持久化队列:

    @Bean("persQueue")public Queue persQueue() {return QueueBuilder.durable(Constants.PERS_QUEUE).build();}

调用 durable 方法即可声明一个持久化队列。

声明非持久化队列:

    @Bean("notPersQueue")public Queue notPersQueue() {return QueueBuilder.nonDurable(Constants.NOT_PERS_QUEUE).build();}

调用 nonDurable 方法即可声明一个持久化队列。

5. 消息持久化

生产者在发送消息时,可以指定该消息是否持久化。

发送持久化消息:

    @RequestMapping("/pres")public String pers() {String messageInfo = "pres message";Message message = new Message(messageInfo.getBytes(StandardCharsets.UTF_8),new MessageProperties());//设置消息持久化message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);rabbitTemplate.convertAndSend(Constants.PRES_EXCHANGE, Constants.PERS_ROUTINGKEY, message);return "持久化消息发送成功";}

MessageDeliveryMode 提供了两个参数,分别为 PERSISTENT 和 NON_PERSISTENT,表示持久化和非持久化。

发送非持久化消息:

    @RequestMapping("/nPres")public String nPers() {String messageInfo = "nPres message";Message message = new Message(messageInfo.getBytes(StandardCharsets.UTF_8),new MessageProperties());//设置消息非持久化message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);rabbitTemplate.convertAndSend(Constants.NOT_PERS_EXCHANGE, Constants.PERS_ROUTINGKEY, message);return "非持久化消息发送成功";}

6. 交换机、队列、消息三者之间持久化的影响

  • 当交换机为持久化时,重启服务器,交换机依然存在
  • 当交换机为非持久化时,重启服务器,交换机不存在
  • 当队列为持久化、队列中的消息为持久化时,重启服务器,队列依然存在,队列中的消息依然存在
  • 当队列为持久化、队列中的消息为非持久化时,重启服务器,队列依然存在,队列中的消息不存在
  • 当队列为非持久化、队列中的消息为持久化时,重启服务器,队列不存在,队列中的消息不存在
  • 当队列为非持久化、队列中的消息为非持久化时,重启服务器,队列不存在,队列中的消息不存在
http://www.dtcms.com/a/264662.html

相关文章:

  • OpenCV仿射变换详解
  • 【飞算JavaAI】智能开发助手赋能Java领域,飞算JavaAI全方位解析
  • 红海云签约东莞科创金融集团,科创金融行业人力资源数字化
  • 论文阅读笔记——VGGT: Visual Geometry Grounded Transformer
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ButtonRippleEffect(按钮涟漪效果)
  • 基于[coze][dify]搭建一个智能体工作流,使用第三方插件抓取热门视频数据,自动存入在线表格
  • Node.js-http模块
  • mac Maven配置报错The JAVA_HOME environment variable is not defined correctly的解决方法
  • 21、企业行政办公(OA)数字化转型:系统如何重塑企业高效运营新范式
  • Android Native 之 inputflinger进程分析
  • 硬件选型与组网规划S7-300以太网模块适配性与网络架构搭建
  • 学习笔记(27):线性回归基础与实战:从原理到应用的简易入门
  • 利器:NPM和YARN及其他
  • 楚存科技SD NAND贴片式T卡—高性能存储解决方案、赋能AI智能硬件
  • 《Jaccard距离》算法:集合差异性度量的核心工具
  • 第三章 计算机网络体系结构
  • 【前端】基础 - HTML基础标签和样式设置
  • 深入理解装饰器模式:动态扩展对象功能的灵活设计模式
  • 前端Base64格式文件上传详解:原理、实现与最佳实践
  • STM32 使用 TinyUSB
  • 03-Linux内核驱动模块加载
  • visual studio Code运行vue项目
  • 4K超高清无缝切换与画面分割矩阵
  • gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究
  • 【AI智能体】基于Coze 制作高质量PPT实战操作详解
  • 打造Docker Swarm集群服务编排部署指南:从入门到精通
  • 降低网络安全中的人为风险:以人为本的路径
  • mr 任务运行及jar
  • FAISS 简介及其与 GPT 的对接(RAG)
  • 人机融合智能 | 人智交互中的人类状态识别