RabbitMQ高级篇-MQ的可靠性

目录

MQ的可靠性

1.如何设置数据持久化

1.1.交换机持久化

1.2.队列持久化

1.3.消息持久化

2.消息持久化

队列持久化:

消息持久化:

3.非消息持久化

非持久化队列:

非持久化消息:

4.消息的存储机制

[4.1持久化消息(Persistent Messages)](#4.1持久化消息(Persistent Messages))

[4.2非持久化消息(Transient 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 服务重启或崩溃,消息也不会丢失。它主要包括以下几个步骤:

队列持久化:

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

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

消息持久化:

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

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

3.非消息持久化

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

非持久化队列:

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

非持久化消息:

  • 当发送消息时,如果没有指定消息的持久化属性(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总结

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

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

相关推荐
滴滴答答哒18 分钟前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn25 分钟前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川31 分钟前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵34 分钟前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David1 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1001 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin2 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质2 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3763 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02143 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法