当下主流的消息系统有RabbitMQ、RocketMQ、ActiveMQ等,而RabbitMQ是基于Erlang开发,无论是并发、延时表现都很好。
RabbitMQ消息可靠性是靠什么实现的?
消息可靠性是RabbitMQ
的一大特点,RabbitMQ
靠什么实现消息可靠性的呢?其实就是通过消息持久化来实现的,这样就避免了服务异常(重启、宕机)下消息和队列丢失的风险。
消息持久化是指RabbitMQ
将内存中的数据(交换器Exchange
、队列Queue
、消息Message
)落地到硬盘中存储,以防止异常情况导致内存中的数据丢失。
RabbitMQ如何实现消息持久化?
RabbitMQ
中不同数据持久化方式是不同的,主要有:
1、交换器(Exchange
)的持久化
交换器Exchange
若丢失会影响后续消息的写入,我们在创建Exchange
时需要指定durable
为true
表示持久化。
2、队列(Queue
)的持久化
在上面第一步操作中,在创建交换器
时即使设置了durable
为true
后,Exchange
不会丢失,但是里面的队列
依旧会丢失。如何保证队列持久化呢?同样是在创建队列
时指定durable
为true
即可。
3、消息(Message
)的持久化
上面两步操作后,在重启RabbitMQ
后,虽然Exchange
和Queue
不会丢失,但是Queue
里的消息是会丢失的,那如何保证消息持久化不丢失呢?我们设置消息投递模式(deliveryMode
)为2
即代表消息持久化。
消息持久化并不能100%保证数据不丢失
当我们将交换器/队列/消息都设置了持久化依旧不能100%保证数据不会丢失。这其实很好理解,内存中的数据写入硬盘是要时间的,突然断电、宕机重启等情况时消息可能没来得及落地,那么这些消息就有丢失的可能。
消息持久化会带来性能问题
我们知道消息持久化是将内存中的数据写入硬盘中,但硬盘的读写速度远不如内存,所以开启消息持久化后会影响RabbitMQ
的性能。