rabbitmq的持久化分成三个部分:交换器的持久化、队列的持久化和消息的持久化
交换器的持久化是通过exchangeDeclare的时候指定durable为true实现的
队列的持久化是通过queueDeclare的时候指定durable为true实现的
消息的持久化是将消息的投递模式 (BasicProperties 中的deliveryMode 属性,MessageProperties.PERSISTENT_TEXT_PLAIN也封装了)设置为2即可实现消息的持久化。
注意:
如果交换器不设置持久化,那么在 RabbitMQ 服务重启之后,相关的交换器元数据会丢失,不过消息不会丢失,只是不能将消息发送到这个交换器中了
如果队列不设置持久化,那么在 RabbitMQ 务重启之后,相关队列的元数据会丢失,此时数据也会丢失
设置了队列和消息的持久化,当 RabbitMQ 服务重启之后,消息依旧存在。单单只设置队列持久化,重启之后消息会丢失;单单只设置消息的持久化,重启之后队列消失,继而消息也丢失。单单设置消息持久化而不设置队列的持久化显得毫无意义。
将所有的消息都设直为持久化,会严重影响 RabbitMQ 的性能。
即使将交换器、队列、消息都设置了持久化之后数据还是会有可能丢失
防止消息丢失:
消费者订阅队列时将autoAck设置为false,消费完成进行手动确认,防止收到消息还没处理完就宕机了。
引入RabbitMQ的镜像队列机制相当于配置了副本,如果主节点(master)在此特殊时间内挂掉,可以自动切换到从节点(slave)。这样有效地保证了高可用性,除非整个集群都挂掉。虽然这样也不能完全保证 RabbitMQ 消息不丢失,但是配置了镜像队列要比没有配置镜像队列的可靠性要高很多
还可以在发送端引入事务机制或者发送方确认机制来保证消息己经正确地发送并存储至RabbitMQ 中。