联合插件预览版发布
注意:这篇博客文章介绍了为 RabbitMQ 2.5.0 发布的联合插件预览版。如果您使用的是 2.6.0 或更高版本,联合是主版本的一部分;您可以通过与其他插件相同的方式获取它。
又一天,另一个新插件发布😃今天是 **联合**。如果您想跳过这篇文章,直接下载插件,请点击 这里。详细说明请点击 这里。
联合的目标是在 WAN 和管理域中扩展发布/订阅消息传递。
为此,我们引入了 **联合交换** 的概念。联合交换就像一个给定类型的正常交换(它可以模拟任何已安装交换类型的路由逻辑),但它还知道如何连接到 **上游** 交换(这些交换本身也可能是联合交换)。
绑定到联合交换的队列接收发布到上游交换(或上游的上游)的消息,以及本地发布的消息。如果网络出现故障,消息将被排队到上游。
那么,这与集群有何不同呢?
联合 | 集群 |
---|---|
代理在逻辑上是分开的,并且可能由不同的所有者拥有。 | 集群形成一个单一的逻辑代理。 |
代理可以运行不同版本的 RabbitMQ 和 Erlang。 | 节点必须运行相同版本的 RabbitMQ,并且经常是 Erlang。 |
代理可以通过不可靠的 WAN 链接连接。通信通过 AMQP(可选地通过 SSL 加密)。 | 代理必须通过可靠的 LAN 链接连接。通信通过 Erlang 节点间消息传递。 |
代理可以以您安排的任何拓扑结构连接。链接可以是单向或双向的。 | 所有节点都双向连接到所有其他节点。 |
从 CAP 定理 中选择可用性和分区容忍性。 | 从 CAP 定理中选择一致性和可用性。 |
代理中的一些交换可能是联合的,而另一些则是本地的。 | 集群是全有或全无的。 |
连接到任何代理的客户端只能看到该代理中的队列。 | 连接到任何节点的客户端可以查看所有节点上的队列。 |
该 自述文件 包含使一切正常运行的详细说明,但让我们看一个简单的示例。
假设我们有三个代理,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 声明联合交换 - 请参阅 自述文件 - 但由于它们可能需要一些协调才能设置,因此在配置文件中声明它们通常更方便)。
每个联合交换都需要一个“上游集”的名称才能使用 - 一组要连接的上游机器 - 因此我们设置了其中一个。
然后,我们列出如何建立每个连接。这里有很多选项;请参阅 自述文件。
最后,我们指定应被视为从上游代理注入消息的本地用户的名称。
当我们启动 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 邮件列表中告诉我们。