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

RabbitMQ高级篇-MQ的可靠性

目录

MQ的可靠性

1.如何设置数据持久化

1.1.交换机持久化

1.2.队列持久化

1.3.消息持久化

2.消息持久化

队列持久化:

消息持久化:

3.非消息持久化

非持久化队列:

非持久化消息:

4.消息的存储机制

4.1持久化消息(Persistent Messages)

4.2非持久化消息(Transient Messages)

4.3关键区别

4.4总结


之前的文章我们介绍了RabbitMQ的发送者的可靠性,接下来我来向大家讲解MQ的可靠性

发送者的可靠性文章

MQ的可靠性

消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。

1.如何设置数据持久化

为了提升性能,默认情况下MQ的数据都是在内存存储的临时数据,重启后就会消失。为了保证数据的可靠性,必须配置数据持久化,包括:

  • 交换机持久化

  • 队列持久化

  • 消息持久化

我们以控制台界面为例来说明。

持久化:数据存储在磁盘,服务宕机了,数据也不会丢失。

非持久化:数据存储在内存,服务宕机了,数据也就不在了

1.1.交换机持久化

在控制台的Exchanges页面,添加交换机时可以配置交换机的Durability参数:

设置为Durable就是持久化模式,Transient就是临时模式。

1.2.队列持久化

在控制台的Queues页面,添加队列时,同样可以配置队列的Durability参数:

1.3.消息持久化

在控制台发送消息的时候,可以添加很多参数,而消息的持久化是要配置一个properties

Non-persistent:消息非持久化 Persistent:消息持久化

2.消息持久化

消息持久化是为了确保即使 RabbitMQ 服务重启或崩溃,消息也不会丢失。它主要包括以下几个步骤:

  1. 队列持久化

    • 当创建队列时,如果指定了队列的持久化属性(durable=true),那么该队列会被写入磁盘。即使 RabbitMQ 服务重启,该队列仍然存在。

    • 但如果队列中没有消息或消息没有被持久化,队列重启后将是空的。

  2. 消息持久化

    • 当发送消息时,如果指定了消息的持久化属性(delivery_mode=2),那么消息会被写入磁盘。即使 RabbitMQ 服务重启,消息仍然存在,直到被消费者消费。

    • 消息的持久化和队列的持久化需要同时设置,否则消息仍然可能丢失。例如,如果队列没有设置持久化,即使消息设置了持久化,队列在重启后也会消失,消息也就随之丢失。

3.非消息持久化

非持久化消息主要用于某些场景下,如消息的可靠性要求不高,或者需要快速传输大量消息。它主要包括以下几个步骤:

  1. 非持久化队列

  • 当创建队列时,如果没有指定队列的持久化属性(durable=false),那么该队列不会被写入磁盘。如果 RabbitMQ 服务重启,该队列将消失。
  1. 非持久化消息

  • 当发送消息时,如果没有指定消息的持久化属性(delivery_mode=1),那么消息不会被写入磁盘。如果 RabbitMQ 服务重启,消息将丢失。

4.消息的存储机制

4.1持久化消息(Persistent Messages)

  • In Memory:持久化消息会被缓存在内存中,以便快速处理。

  • Persistent:这些消息同时也会被写入磁盘进行持久化存储。即使RabbitMQ服务重启,持久化消息也不会丢失,因为它们在磁盘上有副本。

4.2非持久化消息(Transient Messages)

  • In Memory:非持久化消息同样会被缓存在内存中。

  • Paged Out:当内存资源紧张时,RabbitMQ会将部分非持久化消息从内存换出到磁盘。这些消息被换出到磁盘后,如果内存压力减轻,可能会被换回内存。但与持久化消息不同的是,非持久化消息在磁盘上没有持久化副本,因此在RabbitMQ服务重启时,这些消息不会被恢复。

4.3关键区别

  • 持久化消息:内存中的数据是缓存,同时在磁盘上有持久化副本,以确保数据不会丢失。

  • 非持久化消息:内存中的数据是主要存储位置,磁盘上的数据只是在内存压力下的一种临时存储方式,并不用于持久化。

4.4总结

  • 持久化消息:内存和磁盘上都有数据,磁盘上的数据用于持久化。

  • 非持久化消息:内存和磁盘上都有数据,但磁盘上的数据只是临时的,不用于持久化。

http://www.xdnf.cn/news/6267.html

相关文章:

  • 精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶
  • 深入理解 Dijkstra 算法:原理、实现与优化
  • 【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务
  • 数字信号处理-大实验1.3
  • 为什么我不能获取到镜像,ImagePullBackoff
  • 观测云:从云时代走向AI时代
  • 二叉树(中序遍历)
  • 海信璀璨505U6真空冰箱闪耀“国家德比”
  • 从零开始完成“大模型在牙科诊所青少年拉新系统中RAG与ReACT功能实现”的路线图
  • 【Python】对象生命周期全解析
  • 【Python-Day 13】Python 元组 (Tuple) 详解:从创建、操作到高级应用场景一网打尽
  • springboot AOP 接口限流(基于IP的接口限流和黑白名单)
  • 万字解析:Java字符串
  • vue3基础学习(上) [简单标签] (vscode)
  • “redis 目标计算机积极拒绝,无法连接” 解决方法,每次开机启动redis
  • 图表制作-基础饼图
  • Nightingale监控系统介绍与部署(可离线部署)
  • sql server 2019 将单用户状态修改为多用户状态
  • map和unordered_map
  • 七部门:设立“国家创业投资引导基金”,优先支持取得关键核心技术突破的科技型企业上市融资
  • libmemcached库api接口讲解零
  • 使用frp实现客户端开机自启(含静默运行脚本)
  • IEEE PRMVAI 2025 “人工智能的应用“分论坛
  • 在 Rocky Linux 上手动安装 zsh
  • 龙虎榜——20250514
  • Postman接口测试
  • 操作系统实验 实验4 页面置换算法
  • python库sqlalchemy
  • 现代计算机图形学Games101入门笔记(八)
  • K8S redis 部署