1.高可用

RabbitMQ是基于主从(非分布式)做高可用性

RabbitMQ有三种模式:单机模式,普通集群模式,镜像汲取模式。

单机模式:就是Demo级的,用来玩玩的

普通集群模式(无高可用性):就是在多台机器上启动多个RabbitMQ实例,每个机器启动一个。你创建的queue,只会放在一个RabbitMQ实例上,但是没给实例都同步queue的元数据(元数据可以认为是queue的一些配置信息,通过元数据,可以找到queue所在实例)。你在消费的时候,实际上如果连接到了另一个实例,那么实例会从queue所在实例上拉取数据过来。

 

缺点:1.这种方式很麻烦,也没做到所谓的分布式,就是一个普通集群。这样会导致你要么消费这每次随机连接一个实例然后拉取数据,要么固定连接一个queue所在实例消费数据,前者有数据拉取的开销,后者导致实例性能瓶颈。

            2.假设那个放queue的实例宕机了,会导致接下来其他实例就无法从那个实例拉去,如果你开启了消息持久化,让Rabbit'MQ落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个queue拉去数据。这样就没有什么所谓得高可用性,这方案主要是提高吞吐量得,就是说让集群中多个节点来服务某个queue得读写操作。

镜像集群模式(高可用性):跟普通集群模式不一样的是,在镜像群模式下,你创建的queue,无论元数据还是queue里面的消息都会存在于多个实例上,就是说,每个RabbitMQ节点都有这个queue的一个完整镜像,包含queue的全部数据的意思。然后每次写消息到queue的时候,都活自动把消息同步到多个实例的queue上。

那么

如何开启这个镜像集群模式呢?

就是在后台增加一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数据量的节点,再次创建queue的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。

这样的好处在于,你任何一个机器宕机了,也没事,其他机器(节点)还包含这个queue的完整数据,别的consumer都可以到其他节点上去消费数据。

坏处是:1)性能开销大,消息需要同步到到所有机器上,导致网络带宽压力和消耗很重。

               2)不是分布式,没有扩展性可言,假设某个queue负载很重,想通过增加机器来缓解,但是新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue。或者,当你的queue的数据量很大,大到这个机器上的容量无法容纳了,该怎么办呢?????