跳到主要内容
版本:4.1

分布式 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 中的非独占队列。

连接到任何节点的客户端可以使用所有节点上的非独占队列。

© . All rights reserved.