Federation 插件预览版发布
注意:这篇博文讨论的是为 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 包含详细的设置说明,但我们先看一个简单的例子。
假设我们有三个代理:london、paris 和 newyork。我们想要一个名为 stocks(抱歉,这个例子太普通了…)的联邦 topic 交换器。我们将看看 london 代理如何配置以与 paris 和 newyork 进行联邦。
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 邮件列表中告诉我们。