RabbitMQ通过插件提供对 AMQP及其他消息传递协议(例如STOMP)的支持,(当然)本质上是分布式的 - 对于来自多台机器的应用程序连接到一个服务器上是很常见的,甚至是跨域互联网连接。
然而,有时需要或希望使RabbitMQ服务本身分布。有三种方法可以实现这一点:使用clustering,federation和shovel。本页解释了每种方法的目的。
Note that you do not need to pick a single approach - you can connect clusters together with federation, or the shovel, or both.
Clustering
Clustering 将多台计算机连接在一起以形成单个逻辑服务。通过Erlang消息传递进行通信,因此群集中的所有节点必须具有相同的Erlang cookie。群集中的计算机之间的网络链接必须可靠,并且群集中的所有计算机必须运行相同版本的RabbitMQ和Erlang。
虚拟主机,交换,用户和权限将自动镜像到群集中的所有节点。队列可以位于单个节点上,也可以跨多个节点进行镜像。连接到群集中任何节点的客户端可以查看群集中的所有队列,即使它们不在该节点上也是如此。
通常,您可以使用群集实现高可用性和增加的吞吐量,同时将计算机放在一个位置。
Federation
Federation 允许一个服务器上的交换或队列接收消息并发布到另一个服务器上的交换或队列(服务器可以是单独的机器或集群)。通过AMQP(带有可选SSL)进行通信,因此对于两个要联合的交换或队列,必须为它们授予适当的用户和权限。
Federated 交换机通过单向点对点链接相连。 默认情况下,消息将仅通过federation link 单向转发一次,但可以增加消费次数,以允许更复杂的路由拓扑。某些消息可能无法通过链接转发;如果在到达federated exchange后消息不会路由到队列,则不会在第一时间转发该消息。
Federated queues同样与单向点对点链接相连。消息将在联合队列之间移动任意次数以跟随消费者。
通常,您将使用federation来链接整个Internet上的服务器以进行发布/订阅消息传递和工作排队。
The Shovel
使用Shovel进行服务器连接与使用federation进行连接在概念上是一样的。然而,Shovel工作在更低的层面。
Federation旨在提供交换和队列的自发分发,而Shovel 只是消耗来自一个服务器队列的消息,并将其转发给另一个服务器的交换机。
通常,当您需要比Federation提供的更多控制时,您可以使用Shovel在互联网上链接服务器。
Dynamic shovels 也可用于在单个代理上以临时方式移动消息。
总结
Federation / Shovel | Clustering |
---|---|
服务器在逻辑上是分开的,可能有不同的所有者。 | 一个集群组成一个逻辑服务器 |
服务器可是使用不同版本的RabbitMQ 和 Erlang. | 节点必须运行相同版本的RabbitMQ,及Erlang。 |
服务器可以通过不可靠的WAN链接进行连接。通过AMQP进行通信(可选择通过SSL保护),需要设置适当的用户和权限。 | 必须通过可靠的LAN网络连接服务器。通过Erlang节点间消息传递,需要共享的Erlang cookie。 |
服务器可以按照您安排的任何拓扑进行连接。链接可以是单向或双向的。 | 所有节点都在两个方向上连接到所有其他节点。 |
从CAP定理中选择可用性和分区容差(AP)。 | 从CAP定理中选择一致性和分区容差(CP)。 |
服务器中的某些交换机所可能是Federation的,而有些则可能是本地的。 | 集群是全有或全无的。 |
连接到任何服务器的客户端只能看到该服务器中的队列。 | 连接到任何节点的客户端可以在所有节点上查看队列。 |