RabbitMQ支持的amqp或者其他消息传递协议(通过插件)生来就是分布式的,多个机器链接到一个中间人(RabbitMQ服务器)上是很常见的,有时需要RabbitMQ中间人本身也是分布式的,则有三种形式:
集群
集群是多个机器(erlang结点)连接在一起作为一个逻辑上的中间人,通过erlang的消息系统通信,所以集群中的所有结点需要有相同的erlang cookie,之间的网络连接必须稳定,同时集群中的机器上安装的RabbitMQ和erlang版本相同。
虚拟机、exchange、user、权限等设置会自动在集群中的所有结点共享,客户端连接到任意结点都可以获得集群中的所有信息。一般来说使用集群方式是为了高可用性或增加吞吐量,所以机器一般是在一个机房内。
复制
所有的数据和状态在所有结点之间都是相同的,但是队列不是,尽管所有结点都知道这些队列的存在,但是默认只有一个结点有该队列,可以配置该行为(通过高可用性中的配置)。
另外需要主机名的解析
复制队列
默认队列是存储在第一个声明队列的结点上,相对于exchange和binding来说(他们是可以视为所有结点上都有)。可以设置为一个主节点,其他结点为从节点,在主节点挂掉后可以得到新的主节点。而发送到复制队列上的消息是会发送给所有节点的,而接收者无论是连接到哪个节点,都是把ack发送给主节点的。
联邦
联邦允许一个exchange或队列,在收到消息后转发给另一个exchange或队列,通过amqp协议来通信,所以还需要合适的用户和权限设置。
shovel
相比联邦可以提供更多的控制