分布式 RabbitMQ
概述
AMQP 0-9-1、AMQP 1.0 以及 RabbitMQ 通过插件支持的其他消息传递协议(例如 STOMP),本质上是分布式的:应用程序几乎总是连接到远程主机上的 RabbitMQ。
通常,使 RabbitMQ Broker 本身分布式是必要或可取的。有三种方法可以实现这一点:使用集群、Federation 和 Shovel 插件。本页概述了每种方法。
请注意,所有这三种方法并非互斥,并且可以组合使用:集群可以通过 Federation 或 Shovel 连接在一起,或者两者都使用。
集群
集群将多台机器连接在一起以形成集群。节点间通信对客户端是透明的。集群的设计假设网络连接相当可靠,并提供类似 LAN 的延迟。
集群中的所有节点必须运行兼容版本的 RabbitMQ 和 Erlang。
节点之间使用预共享密钥进行身份验证,该密钥通常由部署自动化工具安装。
虚拟主机、交换机、用户和权限在集群中的所有节点之间自动复制。队列可以位于单个节点上,也可以复制其内容以实现更高的可用性。Quorum 队列是一种现代化的复制队列类型,专注于数据安全。流是另一种复制的消息传递数据类型,允许重复消费(读取)。
连接到集群中任何节点的客户端都可以使用集群中所有非独占队列,即使它们不在该节点上。
集群节点可以帮助提高可用性、队列内容的数据安全性和维持更多并发客户端连接。集群、Quorum 队列和流指南提供了关于这些主题的更多详细信息。
Federation
Federation 允许一个 Broker 上的交换机或队列接收发布到另一个 Broker 上的交换机或队列的消息(Broker 可以是单独的机器或集群)。通信通过 AMQP(可选 SSL),因此要使两个交换机或队列进行联合,必须授予适当的用户和权限。
联合交换机通过单向点对点链接连接。默认情况下,消息只会通过 Federation 链接转发一次,但这可以增加以允许更复杂的路由拓扑。某些消息可能不会通过链接转发;如果消息在到达联合交换机后不会被路由到队列,则它最初就不会被转发。
联合队列也类似地通过单向点对点链接连接。消息将在联合队列之间移动任意次数以跟随消费者。
通常,您会使用 Federation 将 Broker 跨互联网连接起来,用于发布/订阅消息传递和工作队列。
Shovels
使用 Shovel 插件连接 Broker 在概念上类似于使用 Federation 连接它们。但是,该插件在较低级别工作。
Federation 旨在提供对交换机和队列的有主见的分布,而 Shovel 只是从一个 Broker 上的队列消费消息,并将它们转发到另一个 Broker 上的交换机。
通常,当您需要比 Federation 提供的更多控制时,您会使用 Shovel 将 Broker 跨互联网连接起来。
动态 Shovel 也可用于在单个 Broker 上以 Ad-hoc 方式移动消息。
总结
Federation 和/或 Shovel | 集群 |
---|---|
Broker 在逻辑上是独立的,并且可能具有不同的所有者。 | 一个集群形成一个单一的逻辑 Broker。 |
Broker 可以运行不同(并且在某些方面不兼容)版本的 RabbitMQ 和 Erlang。 | 节点必须运行兼容版本的 RabbitMQ 和 Erlang。 |
Broker 可以通过不可靠的 WAN 链路连接。通信通过 AMQP 0-9-1(可选地由 TLS 保护),需要设置适当的用户和权限。 | Broker 必须通过相当可靠的 LAN 链路连接。节点将使用共享密钥相互验证,并可选地使用启用 TLS 的链接。 |
Broker 可以以您安排的任何拓扑结构连接。链接可以是单向或双向的。 | 所有节点在两个方向上都连接到所有其他节点。 |
强调来自 CAP 定理的可用性和分区容错性 (AP)。 | 强调来自 CAP 定理的一致性和分区容错性 (CP)。 |
Broker 中的某些交换机可能是联合的,而某些可能是本地的。 | 集群是全有或全无的。 |
连接到任何 Broker 的客户端只能使用该 Broker 中的非独占队列。 | 连接到任何节点的客户端可以使用所有节点上的非独占队列。 |