联邦交换器
概述
本指南涵盖了联邦交换机,这是 Federation 插件 提供的一项功能。
涵盖的一些主题包括:
还有一个单独的 Federation 插件参考 指南。
交换机联邦是一种机制,它允许一个位置(称为上游或源)上的交换机中的消息流被复制到其他位置(下游)的交换机中。下游是独立的节点或集群,可以跨越广域网(地理区域)。复制过程是异步的,并且可以容忍连接故障。
联邦交换机连接到其他交换机。从概念上讲,发布到上游交换机的消息将被复制到联邦交换机,就像它们直接发布到联邦交换机一样。上游交换机不需要重新配置。它们被假定位于单独的节点或单独的集群中。
上游定义是一个 URI,带有某些已识别的查询参数,这些参数控制链接连接参数。可以使用 CLI 工具 或 HTTP API,通过 附加插件 来管理上游。
下面是一个图,显示了一个节点中的单个上游交换机(源交换机)链接到另一个节点中的单个下游交换机(联邦交换机)。
使用交换机联邦时,通常只有一个交换机子集会被联邦。某些交换机可以与“站点”(集群)及其用途固有地本地化。
交换机联邦会在可能的情况下从下游传播 绑定 到上游。它还会应用优化并在需要时选择性地传播消息。这将在 后续章节 中介绍。
用例
联邦交换机可用于将某些消息类型的流复制到远程位置。结合连续的 架构同步 和 队列和消息 TTL,这可以用于在受控的时间窗口内维护具有相当最新的数据的热备用。
另一个用例是实现大规模扇出,其中一个集群中的单个“源”交换机(充当源,无需联邦)可以被其他许多经纪人的联邦交换机声明为上游。反过来,每个交换机都可以成为更多交换机的上游,依此类推。
请参阅 下面的示例图,了解一些可能的安排。
限制
交换机联邦支持所有内置交换机类型。第三方交换机类型可能有效,具体取决于其语义。
默认交换机(名称为空)不能被联邦,因为它不是典型的交换机,并且依赖于其他交换机类型不使用的节点本地优化。
内部属性设置为 true 的交换机由 RabbitMQ 声明和内部使用,不能被联邦。
用法和配置
联邦配置使用 运行时参数和策略,这意味着它可以随着系统拓扑的变化而动态配置和重新配置。有两种关键的配置涉及:
- 上游:它们是联邦系统中的远程端点。
- 联邦策略:它们控制哪些交换机被联邦以及它们将连接到哪些上游(源)。
这两者都配置在下游节点或集群上。
要添加上游,请使用 rabbitmqctl set_parameter 命令。它接受三个参数:
- 参数类型,
federation-upstream - 联邦策略将引用的上游名称
- 包含至少一个必需键
uri的上游定义 JSON 文档
以下示例配置了一个名为“origin”的上游,可以通过 remote-host.local:5672 联系到它。
- 使用 rabbitmqctl (bash)
- 使用 rabbitmqadmin (bash)
- 使用 rabbitmqctl (PowerShell)
- 使用 PowerShell 的 rabbitmqadmin.exe
# Adds a federation upstream named "origin"
rabbitmqctl set_parameter federation-upstream origin '{"uri":"amqp://remote-host.local:5672"}'
# Adds a federation upstream named "origin"
rabbitmqadmin federation declare_upstream_for_exchanges --name origin \
--uri "amqp://remote-host.local:5672"
# Adds a federation upstream named "origin"
rabbitmqctl.bat set_parameter federation-upstream origin '"{""uri"":""amqp://remote-host.local:5672""}"'
# Adds a federation upstream named "origin"
rabbitmqadmin.exe federation declare_upstream_for_exchanges --name origin ^
--uri "amqp://remote-host.local:5672"
更多上游定义参数在 Federation 参考指南 中介绍。
指定上游后,可以添加一个控制联邦的策略。它就像任何其他 策略 一样添加,使用:
- 使用 rabbitmqctl (bash)
- 使用 rabbitmqadmin (bash)
- 使用 rabbitmqctl (PowerShell)
- 使用 PowerShell 的 rabbitmqadmin.exe
# Adds a policy named "exchange-federation"
rabbitmqctl set_policy exchange-federation \
"^federated\." \
'{"federation-upstream-set":"all"}' \
--priority 10 \
--apply-to exchanges
# Adds a policy named "exchange-federation"
rabbitmqadmin policies declare \
--name "exchange-federation" \
--pattern "^federated\." \
--definition '{"federation-upstream-set":"all"}' \
--priority 10 \
--apply-to "exchanges"
# Adds a policy named "exchange-federation"
rabbitmqctl.bat set_policy exchange-federation `
"^federated\." `
'"{""federation-upstream-set"":""all""}"' `
--priority 10 `
--apply-to exchanges
# Adds a policy named "exchange-federation"
rabbitmqadmin.exe policies declare ^
--name "exchange-federation" ^
--pattern "^federated\." ^
--definition "{""federation-upstream-set"":""all""}" ^
--priority 10 ^
--apply-to "exchanges"
在上面的示例中,该策略将匹配在默认虚拟主机中名称以 federated. 前缀开头的交换机。这些交换机将为所有已声明的上游建立联邦链接。策略的名称是 exchange-federation。与任何策略一样,如果多个策略匹配一个交换机,则具有最高优先级的策略将被使用。即使优先级相同,多个策略定义也不会合并。
配置完成后,将为每个匹配的交换机和上游对打开一个联邦链接(连接)。这里的“匹配的交换机”是指由 联邦策略模式 匹配的交换机。如果没有匹配的交换机,将不会启动任何链接。
要为匹配的交换机禁用联邦,请使用其名称删除该策略。
rabbitmqctl clear_policy exchange-federation
复杂拓扑和循环处理
联邦交换机可以成为另一个联邦交换机的“上游”。甚至可以形成“循环”,例如,交换机 A 声明交换机 B 是其上游,交换机 B 声明交换机 A 是其上游。允许更复杂的、多重连接的安排。
然而,这种复杂的拓扑将越来越难以理解和排除故障。
为了防止消息不断被复制和重新路由(陷入永无止境的循环),对消息可以通过链接复制的次数进行了限制(下方 max-hops)。
建议所有通过联邦链接的交换机都是同一类型。混合类型可能并且很可能导致混淆的路由行为。
实现
代理间通信使用 AMQP 0-9-1 实现(可选 通过 TLS 进行安全)。绑定被分组在一起,当绑定在下游发生变化时,将向链接的上游端发送诸如 queue.bind 和 queue.unbind 命令之类的绑定操作。
因此,交换机仅接收它有绑定的消息。绑定会异步复制到上游,因此添加或删除绑定的效果仅保证最终可见。
消息被缓冲在在上游交换机的集群中创建的内部声明的队列中。这称为上游队列。上游队列是使用分组的绑定与上游交换机绑定的。可以在 上游配置 中定制此队列的某些属性。
下面是一个详细的图,显示了一个单独的联邦交换机链接到一个单独的上游交换机,包括联邦插件显示的灰色上游队列和绑定。上游链接上的粗箭头表示联邦交换机重新发布的消息。一些潜在的发布者客户端显示发布到两个交换机。

发布到任一交换机的消息都可以被绑定到联邦交换机的队列接收,但直接发布到联邦交换机的消息不能被绑定到上游交换机的队列接收。
示例拓扑
我们说明了一些示例联邦拓扑。在这些图表中显示 RabbitMQ 代理的地方(由 指示)可以是节点集群或独立节点。
| 拓扑 | 描述 |
| 一对联邦交换机 | 在此对称安排中,每个交换机都链接到另一个。图示了连接到每个代理的发布者和使用者。两个使用者都可以接收由任一发布者发布的消息。
两个链接都声明为 |
| 完整图 | 这种安排是三个交换机的成对联邦交换机的类似物。每个交换机都链接到另外两个。
再次, |
| 扇出 | 一个源交换机(无需联邦)被一个交换机树链接,该树可以扩展到任何深度。在这种情况下,发布到源交换机的消息可以被连接到树中任何代理的任何使用者接收。
由于没有循环,因此正确设置 |
| 环形 | 在这个六个代理的环中,每个联邦交换机只链接到环中的另一个。
这种拓扑虽然在队列和连接方面相对便宜,但与完全连接的图相比却相当脆弱。一个代理(或连接)的故障会打破环。 |



