跳至主要内容

联合插件预览版发布

·阅读时长 4 分钟
Simon MacMullen

注意:这篇博客文章介绍了为 RabbitMQ 2.5.0 发布的联合插件预览版。如果您使用的是 2.6.0 或更高版本,联合是主版本的一部分;您可以通过与其他插件相同的方式获取它。

又一天,另一个新插件发布😃今天是 **联合**。如果您想跳过这篇文章,直接下载插件,请点击 这里。详细说明请点击 这里

联合的目标是在 WAN 和管理域中扩展发布/订阅消息传递。

为此,我们引入了 **联合交换** 的概念。联合交换就像一个给定类型的正常交换(它可以模拟任何已安装交换类型的路由逻辑),但它还知道如何连接到 **上游** 交换(这些交换本身也可能是联合交换)。

绑定到联合交换的队列接收发布到上游交换(或上游的上游)的消息,以及本地发布的消息。如果网络出现故障,消息将被排队到上游。

那么,这与集群有何不同呢?

联合集群
代理在逻辑上是分开的,并且可能由不同的所有者拥有。集群形成一个单一的逻辑代理。
代理可以运行不同版本的 RabbitMQ 和 Erlang。节点必须运行相同版本的 RabbitMQ,并且经常是 Erlang。
代理可以通过不可靠的 WAN 链接连接。通信通过 AMQP(可选地通过 SSL 加密)。代理必须通过可靠的 LAN 链接连接。通信通过 Erlang 节点间消息传递。
代理可以以您安排的任何拓扑结构连接。链接可以是单向或双向的。所有节点都双向连接到所有其他节点。
CAP 定理 中选择可用性和分区容忍性。从 CAP 定理中选择一致性和可用性。
代理中的一些交换可能是联合的,而另一些则是本地的。集群是全有或全无的。
连接到任何代理的客户端只能看到该代理中的队列。连接到任何节点的客户端可以查看所有节点上的队列。

自述文件 包含使一切正常运行的详细说明,但让我们看一个简单的示例。

假设我们有三个代理,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 声明联合交换 - 请参阅 自述文件 - 但由于它们可能需要一些协调才能设置,因此在配置文件中声明它们通常更方便)。

每个联合交换都需要一个“上游集”的名称才能使用 - 一组要连接的上游机器 - 因此我们设置了其中一个。

然后,我们列出如何建立每个连接。这里有很多选项;请参阅 自述文件

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

当我们启动 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 联合,但这并不是唯一的方法 - 例如,您可以将代理连接到单向环中,或者在树形结构中使用代理进行大规模广播。

当然,由于这是一个预览版,因此存在一些限制。最糟糕的是 **联合与集群不兼容**。您不应该在集群中使用联合插件。这是我们要解决的第一个问题。

还有一些其他限制:您无法联合标题交换。除非您重新启动代理,否则您无法更改联合的机器。没有状态报告(除了写入日志的消息)。同样,这些问题将会得到解决。

所以 - 这对您有用吗?您怎么认为?(提醒:在这里下载 这里)。请在评论区或 rabbitmq-discuss 邮件列表中告诉我们。

© 2024 RabbitMQ. All rights reserved.