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