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