文章目录
- 一、概念
- 二、队列持久化
- 三、消息持久化
本文参考:
尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq
RabbitMQ 详解
Centos7环境安装Erlang、RabbitMQ详细过程(配图)
一、概念
在RabbitMQ系列学习笔记(四)–消息应答机制中我们已经看到了如何处理任务不丢失的情况,即消息应答和失败重新入队机制。但是如何保障当RabbitMQ服务停掉以后消息生产者发送过来的消息不丢失。需要做两件事:将队列和消息都标记为持久化。
二、队列持久化
之前创建的队列都是非持久化的,rabbitmq如果重启的话,该队列就会被删除掉,如果要队列实现持久化 需要在声明队列的时候把durable参数设置为 true(持久化)。
但是需要注意的就是如果之前声明的这个队列不是持久化的,需要把原先队列先删除,或者重新创建一个不同名的持久化队列,不然就会出现错误。
以下为控制台中持久化与非持久化队列的UI显示区:蓝色的大写字母D表示该队列是持久化的。
这个时候即使重启rabbitmq队列也依然存在。
三、消息持久化
要想让消息实现持久化需要在消息生产者修改代码,添加MessageProperties.PERSISTENT_TEXT_PLAIN
这个属性。
当设置为消息持久化后,消息不仅会保存在内存,还会持久化一份到磁盘中,即使故障重启,消息还在。
但是这种情况并不能保证数据一定不会丢失,假如一条消息刚准备存储到磁盘的时候,还没存储完,消息并未真正完全写入磁盘,出现了故障,仍然有可能会丢失消息。保障数据安全性还需要结合发布确认机制共同实现。