跳至主内容

Federation 插件预览版发布

·5 分钟阅读
Simon MacMullen

注意:这篇博文讨论的是为 RabbitMQ 2.5.0 发布的一个 federation 插件预览版。如果您使用的是 2.6.0 或更高版本,federation 是主发行版的一部分;您可以像获取任何其他插件一样获取它。

又一天,又一款新插件发布😃今天发布的是 **federation**。如果您想跳过这篇博文直接下载插件,请前往此处。详细说明请参见此处

Federation 的高级目标是在广域网和管理域中扩展发布/订阅消息。

为此,我们引入了 **federation exchange** 的概念。federation exchange 像一个给定类型的普通 exchange 一样工作(它可以模拟任何已安装的 exchange 类型的路由逻辑),但它也知道如何连接到 **上游** exchange(这些上游 exchange 本身也可能是 federation exchange)。

绑定到联邦交换器的队列会接收到发布到上游交换器(或上游的上游)的消息,以及本地发布的消息。如果网络中断,消息将被排队在上游。

那么这与集群有什么不同呢?

联邦集群
代理是逻辑上独立的,可以有不同的所有者。集群形成一个单一的逻辑代理。
代理可以运行不同版本的 RabbitMQ 和 Erlang。节点必须运行相同版本的 RabbitMQ,通常也需要 Erlang。
代理可以通过不可靠的广域网链路连接。通信通过 AMQP(可选 SSL 安全)。代理必须通过可靠的局域网链路连接。通信通过 Erlang 节点间消息传递。
代理可以按照您安排的任何拓扑进行连接。链路可以是单向或双向的。所有节点都双向连接到其他所有节点。
CAP 定理中选择可用性和分区容错性。从 CAP 定理中选择一致性和可用性。
代理中的一些交换器可以是联邦的,而一些可以是本地的。集群是全有或全无的。
连接到任何代理的客户端只能看到该代理中的队列。连接到任何节点的客户端可以看到所有节点上的队列。

README 包含详细的设置说明,但我们先看一个简单的例子。

假设我们有三个代理:londonparisnewyork。我们想要一个名为 stocks(抱歉,这个例子太普通了…)的联邦 topic 交换器。我们将看看 london 代理如何配置以与 parisnewyork 进行联邦。

london 的一个简单的 rabbitmq.config 文件看起来会是这样:

[
{rabbitmq_federation,
[{exchanges, [[{exchange, "stocks"},
{virtual_host, "/"},
{type, "topic"},
{durable, true},
{auto_delete, false},
{internal, false},
{upstream_set, "common-upstreams"}]]},
{upstream_sets, [{"common-upstreams", [[{connection, "newyork"}],
[{connection, "paris"}]]}
]},
{connections, [{"newyork", [{host, "newyork.mycompany.com"}]},
{"paris", [{host, "paris.mycompany.com"}, {protocol, "amqps"},
{username, "my-user"}, {password, "secret"}]}
]},
{local_username, "my-user"}
]}
].

rabbitmq_federation 应用程序有几个配置选项。

首先,我们配置要声明的交换器。(您可以通过 AMQP 声明联邦交换器 - 请参阅 README - 但由于它们可能需要一些协调来设置,因此通常在配置文件中声明它们更方便)。

每个联邦交换器都需要一个“上游集”的名称来工作 - 一组要连接的上游机器 - 因此我们设置了一个。

然后,我们列出了如何建立每次连接。这里有很多选项;请参阅 README

最后,我们指定了应该被视为从上游代理注入消息的本地用户的名称。

当我们启动 london 代理时,我们应该在日志中看到类似这样的消息:

=INFO REPORT==== 22-Jun-2011::12:16:42 ===
Federation exchange 'stocks' in vhost '/' connected to newyork.mycompany.com:5672:/:stocks

=INFO REPORT==== 22-Jun-2011::12:16:43 ===
Federation exchange 'stocks' in vhost '/' connected to paris.mycompany.com:5671:/:stocks

该交换器现在将接收远程发布的消息。

在这种情况下,我们可能还会配置其他代理与 london 进行联邦,但这并不是唯一的做法 - 例如,您可以将代理连接成单向环形,或者通过树形结构的大规模扇出。

当然,存在局限性,因为这是一个预览版。最糟糕的是**联邦与集群不兼容**。您不应该在集群中使用联邦插件。这是我们要修复的第一件事。

还有其他局限性:您不能联邦 header 交换器。除非重启代理,否则您无法更改您与之联邦的机器。没有状态报告(除了写入日志的消息)。这些也都会得到修复。

那么,这对您有用吗?您怎么看?(提醒:在此 下载)。请在评论区或 rabbitmq-discuss 邮件列表中告诉我们。

© . This site is unofficial and not affiliated with VMware.