RabbitMQ有两种部署模式:普通模式、镜像模式。
普通模式
多台机器,每台机器上启动一个 RabbitMQ 实例。
但是创建的 Queue 只会放在一个 RabbitMQ 实例上,其它实例都同步该实例上的 Queue 的元数据。
当我们消费时 Queue 中的消息时,如果连接到了另外一个实例,那么那个实例会从 Queue 所在的实例上拉取数据。
这种方式其实就是个普通集群,没有实现所谓的分布式。
因为要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个 Queue 所在的实例,前者有数据拉取的开销,后者到hi单实例性能瓶颈。
而且如果那个 Queue 所在的实例宕机了,会导致接下来其它实例就无法从那个实例拉取数据,如果开启了消息持久化,让 RabbitMQ 落地存储消息的话,消息不一定会丢,但是得等到那个实例恢复后,其它实例才可以继续从那个 Queue 拉取数据。
这种方案并没有实现高可用性,主要是提高吞吐量的,就是说让集群中多个节点来服务某个 Queue 的读写操作。
镜像模式
该模式才是所谓的 RabbitMQ 的高可用模式,跟普通模式不一样的是:创建的 Queue,无论是元数据还是 Queue 里的消息都会存在于多个实例上,然后每次写消息到 Queue 的时候,都会自动把消息同步写到其它实例的 Queue 中。
这样的好处在于,当集群中任何一个机器宕机了,其它的机器都可以使用。
坏处在于,将消息同步到所有机器,会导致网络带宽压力和消耗很重!另外也不再有扩展性可言:如果某个 Queue负载很重,那么当我们新增机器时,新增的机器也会包含这个 Queue 的所有数据,从而不能线性扩展 Queue。
怎么开启镜像集群模式呢?RabbitMQ 有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候可以要求数据同步到所有节点的,也可以要求就同步到指定数量的节点,然后再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。