跳至主要内容
版本:3.13

交换机和队列联合

概述

联合插件的主要目标是在不进行集群的情况下传输消息。这出于以下几个原因非常有用。

节点或集群的松散耦合

联合插件可以在不同管理域中的代理(或集群)之间传输消息

  • 它们可能托管在不同的数据中心,可能位于不同的洲
  • 它们可能具有不同的用户、虚拟主机、权限和用途
  • 它们可能运行在 RabbitMQ 和 Erlang 的不同版本上
  • 它们可能具有不同的规模
  • 它们可能是

广域网友好性

联合插件通信完全是异步的,并假设集群之间的连接会不时失败。因此,它能够很好地容忍间歇性连接,并且不会在远程集群之间创建耦合(在可用性方面)。

特异性

代理可以包含联合的仅局部的组件,以最佳地适应系统的所需架构。

随着连接节点数量的增加而扩展

联合不需要在N个代理之间建立 O(n2) 个连接(尽管这是设置的最简单方法)。

它能做什么?

联合插件使联合交换机和队列成为可能。联合交换机或队列可以从一个或多个称为上游的远程集群接收消息(更准确地说:存在于远程集群中的交换机和队列)。

联合交换机可以将上游发布的消息路由到本地队列。联合队列允许本地消费者从上游队列接收消息,当远程队列本身没有任何消费者在线时。

联合链接连接到上游的方式与应用程序连接的方式基本相同。因此,它们可以连接到特定 vhost,使用 TLS,使用多个身份验证机制

联合文档组织为多个更集中的指南

  • 交换机联合:用于将通过交换机流向的消息复制到远程集群
  • 队列联合:用于在 N 个集群之间创建“逻辑队列”,这将在消费者所在位置移动消息(如果没有本地消费者)
  • 联合设置参考

如何设置联合?

设置联合涉及两个步骤

  • 首先,必须定义一个或多个上游。它们为联合提供有关如何连接到其他节点的信息。这可以通过运行时参数联合管理插件来完成,该插件将在管理 UI中添加一个联合管理选项卡。
  • 要启用联合,必须声明一个或多个策略,这些策略与交换机或队列匹配。该策略将使其成为联合的。

入门

联合插件包含在 RabbitMQ 发行版中。要启用它,请使用rabbitmq-plugins

rabbitmq-plugins enable rabbitmq_federation

如果使用管理 UI,建议也启用 rabbitmq_federation_management

rabbitmq-plugins enable rabbitmq_federation_management

在集群中使用联合时,集群的所有节点都应启用联合插件。

有关联合上游的信息存储在 RabbitMQ 数据库中,以及用户、权限、队列等。联合涉及三个级别的配置

  • 上游:每个上游定义一个远程连接端点。
  • 上游集:每个上游集将一组上游组合在一起以用于联合。
  • 策略:每个策略选择一组交换机、队列或两者,并将单个上游或上游集应用于这些对象。

在实践中,对于简单的用例,您几乎可以忽略上游集的存在,因为存在一个隐式定义的上游集,名为 all,所有上游都将添加到其中。

上游和上游集都是运行时参数的实例。与交换机和队列一样,每个虚拟主机都有自己独特的参数和策略集。有关参数和策略的更通用信息,请参见有关参数和策略的指南。有关联合使用的参数的完整详细信息,请参见联合参考

参数和策略可以通过三种方式设置

  • 使用CLI 工具
  • 在管理 UI 中,如果启用了扩展插件(rabbitmq_federation_management
  • 使用 HTTP API

HTTP API 存在一个限制:它不支持上游集的管理。

基本示例

这里,我们将联合所有内置交换机,除了默认交换机,使用单个上游。该上游将被定义为在断开连接时缓冲消息长达一小时(3600000 毫秒)。

要定义上游,请使用以下示例之一,每个选项卡一个

rabbitmqctl set_parameter federation-upstream my-upstream \
'{"uri":"amqp://target.hostname","expires":3600000}'

然后定义一个策略,该策略将匹配内置交换机并使用此上游

rabbitmqctl set_policy --apply-to exchanges federate-me "^amq\." \
'{"federation-upstream-set":"all"}'

定义的策略将使_名称以 "amq." 开头的交换机(所有内置交换机,除了默认交换机)具有(隐式)低优先级,并使用隐式创建的上游集 "all" 对其进行联合,该集包括我们新创建的上游。

任何其他匹配策略,其优先级大于 0,将优先于此策略。请记住,federate-me 只是我们在此示例中使用的名称,您可以使用任何您想要的字符串。

内置交换机现在应该已联合,因为它们与策略匹配。您可以通过检查管理中的交换机列表或使用以下命令来检查策略是否已应用于交换机

rabbitmqctl list_exchanges name policy | grep federate-me

您还可以使用 Admin > Federation Status > Running Links 或以下命令来检查每个交换机的联合链接是否已启动

# This command will be available only if federation plugin is enabled
rabbitmqctl federation_status

一般来说,每个应用于交换机的上游都会有一个联合链接。例如,如果三个交换机有两个上游,那么每个交换机将有六个链接。

对于简单用途,这应该足够了 - 您可能需要查看AMQP URI 参考

联合参考包含有关上游参数和上游集的更多详细信息。

联合使用的节点间连接基于 AMQP 0-9-1 连接。联合链接可以被操作员视为特殊类型的客户端。

如果链接失败,例如由于网络中断,它将尝试重新连接。重新连接周期是可配置的值,在定义上游时定义。有关设置上游和上游集的更多详细信息,请参见联合参考

链接通常会无限期地尝试恢复,但存在一些情况下它们会放弃

  • 失败率过高(最大容忍率取决于上游的 reconnect-delay,但默认情况下通常是每隔几秒钟失败一次)。
  • 链接不再能找到其“源”队列或交换机。
  • 策略以使链接认为自己不再需要的方式更改。

通过增加上游的 reconnect-delay,可以容忍更高的链接失败率。这主要适用于 RabbitMQ 安装,其中有中等或大量活动链接。

联合集群

集群可以通过联合彼此链接,就像单个代理可以彼此链接一样。为了总结集群和联合的交互方式

  • 您可以在下游集群的任何节点上定义策略和参数;一旦在一个节点上定义,它们将应用于所有节点。
  • 交换机联合链接将在下游集群的任何节点上启动。如果它们运行所在的节点崩溃或停止,它们将故障转移到其他节点。
  • 队列联合链接将在与下游队列相同的节点上启动。如果下游队列是复制的队列,它们将在与领导者相同的节点上启动,并在任何未来的领导者选举之后在与新领导者相同的节点上重新创建。
  • 要连接到上游集群,您可以在单个上游中指定多个 URI。每次尝试连接时,联合链接过程将随机选择其中一个 URI。

使用 TLS 保护联合连接

联邦连接(链接)可以使用 TLS 加密。由于联邦在底层使用 RabbitMQ 客户端,因此需要同时配置源代理以监听 TLS 连接,并配置联邦/Erlang 客户端使用 TLS。

要配置联邦使用 TLS,需要执行以下操作:

与“常规”客户端连接一样,服务器的 CA 应在运行联邦链接的节点上受信任,反之亦然。

联邦链接监控

每个联邦交换或队列和上游的组合都需要一个运行的链接。这是从上游检索消息并将其重新发布到下游的过程。可以使用 rabbitmqctl 和管理插件监控联邦链接的状态。

使用 CLI 工具

可以使用RabbitMQ CLI 工具检查联邦链接状态。

调用

# This command will be available only if federation plugin is enabled
rabbitmqctl federation_status

这将输出目标节点上运行的联邦链接列表(不是集群范围的)。它包含以下键

参数名称描述
type

根据此链接关联的联邦资源类型,可以是 exchangequeue

name

联邦交换或队列的名称

vhost

包含联邦交换或队列的虚拟主机

upstream_name

此链接连接到的上游的名称

status

链接的状态

  • starting
  • {running, LocalConnectionName}
  • {shutdown, Error}
connection

此链接的连接名称(来自配置)

timestamp

上次状态更新的时间戳

以下是一个示例

# This command will be available only if federation plugin is enabled
rabbitmqctl federation_status
# => [[{type,<<"exchange">>},
# => {name,<<"my-exchange">>},
# => {vhost,<<"/">>},
# => {connection,<<"upstream-server">>},
# => {upstream_name,<<"my-upstream-x">>},
# => {status,{running,<<"<[email protected]>">>}},
# => {timestamp,{{2020,3,1},{12,3,28}}}]]
# => ...done.

使用管理界面

启用rabbitmq_federation_management 插件,该插件扩展了管理界面,在集群中添加了一个新页面,用于显示联邦链接。可以在 Admin > Federation Status 中找到它,或者使用 GET /api/federation-links HTTP API 端点。