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 服务重启或崩溃,消息也不会丢失。它主要包括以下几个步骤:
-
队列持久化:
-
当创建队列时,如果指定了队列的持久化属性(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总结
-
持久化消息:内存和磁盘上都有数据,磁盘上的数据用于持久化。
-
非持久化消息:内存和磁盘上都有数据,但磁盘上的数据只是临时的,不用于持久化。