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

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

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

相关推荐
leobertlan3 小时前
2025年终总结
前端·后端·程序员
面向Google编程3 小时前
从零学习Kafka:数据存储
后端·kafka
易安说AI4 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI4 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI4 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
颜酱6 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_6 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble6 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟6 小时前
使用ASM和agent监控属性变化
java