消息中间件:谈一谈 RabbitMQ 的持久化机制

消息中间件,又叫MQ,这几年逐渐火爆起来,尤其擅长处理异构系统间的消息传递和对突发流量的削峰限流,而RabbitMQ是其中最典型的代表。

消息中间件:谈一谈 RabbitMQ 的持久化机制

一、RabbitMQ 简介

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Java、C、PHP等,支持AJAX。可用于在分布式系统中存储转发消息,RabbitMQ有如下特点,

  • 可靠性,使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  • 灵活的路由,在消息进入队列之前,通过 Exchange 来路由消息的。
  • 消息集群,多个服务器可以组成一个集群,形成一个逻辑 Broker 。
  • 高可用,队列可以在集群中的机器上进行镜像,在部分节点出问题的情况下队列仍然可用。
  • 多协议,支持多种消息队列协议,比如 STOMP、MQTT 等。
消息中间件:谈一谈 RabbitMQ 的持久化机制

二、RabbitMQ 持久化机制

RabbitMQ的持久化主要是为了防止消息丢失,主要分两类持久化,

  • 交换机、队列持久化:持久化交换机和队列,设置交换机和队列的durable属性为ture。
  • 消息持久化:持久化消息本身,设置消息的“投递模式”属性设置为 2 (delivery_mode=2)。
消息中间件:谈一谈 RabbitMQ 的持久化机制

RabbitMQ 会把持久化的数据写入磁盘上的一个持久化日志文件,在做数据恢复时,从磁盘读取持久化的数据重建。当发布一条持久化的消息到持久化的交换机上时,RabbitMQ 会在消息提交到日志文件后才发送响应。如果RabbitMQ重启,服务器会自动重建交换机和队列,重播持久性日志文件中的消息到合适的队列或者交换机上。

三、对 RabbitMQ 持久化机制的几点看法

有时候因断电等原因,重启RabbitMQ后,队列和交换器都会丢失(随同里面的消息)。而RabbitMQ的消息持久化,极大的避免了这种情况的发生,给我们了一个很好的选择。

消息中间件:谈一谈 RabbitMQ 的持久化机制

但是有利就有弊,这里我主要谈下缺点:

首先,消息持久化对RabbitMQ的性能有较大影响,写入磁盘要比写入内存慢很多,而且会极大的减少RabbitMQ服务器每秒可处理的消息总数,导致消息吞度量降低至少10倍的情况并不少见。

其次,持久化消息在RabbitMQ内建集群环境中工作的并不好,实际上集群上的队列均匀分布在各个节点上而且没有冗余,如果运行a队列的节点崩溃了,那么直到节点恢复前,这个队列就从整个集群消失了,而且这个节点上的所有队列不可用,而且持久化队列也无法重建。

消息中间件:谈一谈 RabbitMQ 的持久化机制

最后要注意一点,如果原交换器或者队列是非持久的,一定要删除后才可重新创建持久化或者也可以创建其他名称的交换器或者队列。


分享到:


相關文章: