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总结

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

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

相关推荐
catchadmin1 小时前
PHP 快速集成 ChatGPT 用 AI 让你的应用更聪明
人工智能·后端·chatgpt·php
GUIQU.1 小时前
【QT】嵌入式开发:从零开始,让硬件“活”起来的魔法之旅
java·数据库·c++·qt
callJJ5 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
wangjialelele5 小时前
Linux中的线程
java·linux·jvm·c++
谷咕咕5 小时前
windows下python3,LLaMA-Factory部署以及微调大模型,ollama运行对话,开放api,java,springboot项目调用
java·windows·语言模型·llama
没有bug.的程序员6 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
在下村刘湘6 小时前
maven pom文件中<dependencyManagement><dependencies><dependency> 三者的区别
java·maven
不务专业的程序员--阿飞7 小时前
JVM无法分配内存
java·jvm·spring boot
你的人类朋友7 小时前
JWT的组成
后端
李昊哲小课7 小时前
Maven 完整教程
java·maven