4.22. 联邦地址和队列
联邦支持在代理间传输信息,而无需代理位于一个通用集群中。代理可以是独立的,也可以在单独的集群中。另外,源和目标代理可以位于不同的管理域中,这意味着代理可能具有不同的配置、用户和安全设置。代理甚至可能使用不同版本的 AMQ Broker。
例如,联邦适合可靠地将信息从一个集群发送到另一个集群。这种传输可能会跨越广域网(WAN)、云基础架构的区域或互联网。如果从源代理连接到目标代理丢失(例如,由于网络失败),则源代理会尝试重新建立连接,直到目标代理重新上线为止。当目标代理重新上线时,消息传输会恢复。
管理员可以使用地址和队列策略来管理联邦。策略配置可以匹配到特定的地址或队列,或者策略可以包含与一组地址或队列匹配的通配符表达式。因此,联邦可以动态应用,作为队列或地址被添加到匹配集合中,或从匹配的集合中删除。策略 可以包含多个 表达式,包括和/或排除特定地址和队列。另外,多个策略也可以应用到代理或代理集群。
在 AMQ Broker 中,两个主要的联邦选项是 address federation 和 queue federation。这些选项在后面的部分中描述。
代理可以包含联邦 和 仅限本地组件的配置。也就是说,如果您在代理上配置联邦,则不需要联合该代理上的所有内容。
4.22.1. 关于地址联邦
地址联邦类似于连接的代理之间的完整多播分布模式。例如,发送到 BrokerA
上地址的每个消息都会传送到该代理上的每个队列。另外,每个消息都传送到 BrokerB
,以及所有附加的队列。
地址联邦动态将代理链接到远程代理中的地址。例如,如果本地代理希望从远程代理上的地址获取信息,则会在远程地址上自动创建队列。然后,远程代理上的消息会消耗到这个队列。最后,消息会复制到本地代理上的对应地址,就像它们最初直接发布到本地地址一样。
远程代理不需要重新配置,以允许联邦在其上创建地址。但是,本地 代理需要向远程地址授予权限。
4.22.2. 用于地址联邦的通用拓扑
下面介绍了一些使用地址联邦的拓扑。
- 对称拓扑
在对称拓扑中,生成者和消费者连接到每个代理。队列及其使用者可以接收由任一制作者发布的消息。对称拓扑示例如下所示:
图 4.5. 对称拓扑中的地址联邦
为对称拓扑配置地址联邦时,务必要将 address 策略的
max-hops
属性的值设置为1
。这样可确保消息 仅复制一次,避免 cyclic 复制。如果此属性设置为较大的值,则消费者将接收同一消息的多个副本。- 完整网格拓扑
完整网格拓扑与对称设置类似。三个或更多的代理会相互独立处理,从而创建一个完整的网格。在此设置中,生成者和消费者连接到每个代理。队列及其使用者可以接收任何制作者发布的消息。此拓扑的示例如下所示。
图 4.6. 在完整网格拓扑中处理联邦
与对称设置一样,在为完整网格拓扑配置地址联邦时,务必要将地址策略的
max-hops
属性的值设置为1
。这样可确保消息 仅复制一次,避免 cyclic 复制。- Ring topology
在代理环中,每个联邦地址都上游到环中另一个地址。此拓扑的示例如下所示。
图 4.7. 环拓扑中的地址联邦
当您为环拓扑配置联邦时,为了避免 cyclic 复制,务必要将地址策略的
max-hops
属性设为n-1
,其中 n 是环中的节点数。例如,在上面的环拓扑中,max-hops
的值设为5
。这可确保环中的每个地址都 准确看到消息一次。环路拓扑的一个优点是,根据您需要进行的物理连接数量,可以更便宜设置。但是,这种类型的拓扑的一个缺陷在于,如果单个代理失败,整个环会失败。
- fan-out 拓扑
在 fan-out 拓扑中,单个 master 地址通过联邦地址树链接至。发布到 master 地址的任何消息都可由与树中任何代理连接的消费者接收。树可以被配置为任何深度。也可以扩展树,无需在树中重新配置现有代理。此拓扑的示例如下所示。
图 4.8. 在 fan-out 拓扑中地址联邦
当您为 fan-out 拓扑配置联邦时,请确保将地址策略的
max-hops
属性设为n-1
的值,其中 n 是树中的级别数量。例如,在上面的 fan-out 拓扑中,max-hops
的值设置为2
。这样可确保树中的每个地址都 准确看到消息一次。
4.22.3. 支持在地址联邦配置中使用 divert 绑定
在配置地址联邦时,您可以在地址策略配置中添加对分离绑定的支持。添加此支持可让联邦响应分离绑定,以便在远程代理上为给定地址创建联邦消费者。
例如,假设地址策略中包含了一个名为 test.federation.source
的地址,并且不包含另一个名为 test.federation.target
的地址。通常,当一个队列在 test.federation.target
上创建,不会导致创建联邦消费者,因为地址不是地址策略的一部分。但是,如果您创建一个 divert 绑定,使得 test.federation.source
是源地址,test.federation.target
是转发地址,则会在转发地址处创建一个持久化消费者。源地址仍然必须使用 multicast
路由类型,但目标地址可以使用 multicast
或 anycast
。
示例用例是一个 divert,它将一个 JMS 主题(多播地址
)重定向到 JMS 队列(任播
地址)。这可实现对传统消费者的消息进行负载平衡,以便不支持 JMS 2.0 和共享订阅。
4.22.4. 配置联邦
您可以使用 Core 协议或从 7.12、AMQP 开始配置地址和队列联邦。使用 AMQP 进行联邦提供以下优点:
- 如果客户端使用 AMQP 进行消息传递,使用 AMQP 进行联邦无需在 AMQP 和核心协议之间进行转换,反之亦然,如果联邦使用 Core 协议,则需要它。
- AMQP 联邦支持通过单一传出连接进行双向联邦。这消除了远程代理连接到本地代理的需求,这是您使用 Core 协议进行联邦时的要求,这可能被网络策略阻止。
4.22.4.1. 使用 AMQP 配置联邦
您可以使用以下策略使用 AMQP 配置地址和队列联邦:
- 本地地址策略将本地代理配置为监视地址的需求,以及当该需求存在时,在远程代理上的匹配地址上创建一个联合消费者,以联合消息到本地代理。
- 远程地址策略将远程代理配置为监视地址的需求,并且当该需求存在时,在本地代理上的匹配地址上创建一个联合消费者,以便将消息发送到远程代理。
- 本地队列策略将本地代理配置为监视队列上的需求,并且当该需求存在时,在远程代理上的匹配队列上创建一个联合消费者,以联合消息到本地代理。
- 远程队列策略将远程代理配置为监视队列上的需求,并且当该需求存在时,在本地代理上的匹配队列上创建一个联合消费者,以联合消息到远程代理。
远程地址和队列策略发送到远程代理,并成为远程代理上的本地策略,以提供反向联邦连接。为反向联邦连接应用策略,接收策略的代理是本地代理,发送策略的代理是远程代理。通过在本地代理上配置远程地址和队列策略,您可以在单个代理上保留所有联邦配置,例如,对于 hub-and-spoke 拓扑,这可能是一个有用的方法。
4.22.4.1.1. 使用 AMQP 配置地址联邦
使用 & lt;broker-connections&
gt; 元素来配置使用 AMQP 的地址联邦。
前提条件
< amqp-connection>
; 元素中指定的用户具有与远程代理上地址和队列匹配的读写权限。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加一个 <
;broker connections>
; 元素,其中包含 <amqp-connection>
; 元素。在 <amqp-connection
> 元素中,指定远程代理的连接详情,并为联邦配置分配一个名称。例如:<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
添加 &
lt;federation
> 元素,并包括以下一个或多个项:-
一个
<local-address-policy
> 元素,将消息从远程代理到本地代理。 -
一个
<remote-address-policy
> 元素,将消息从本地代理到远程代理。
以下示例显示了一个带有本地和远程地址策略的 federation 元素。
<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> <federation> <local-address-policy name="example-local-address-policy" auto-delete="true" auto-delete-delay="1" auto-delete-message-count="2" max-hops="1" enable-divert-bindings="true"> <include address-match="queue.news.#" /> <include address-match="queue.bbc.news" /> <exclude address-match="queue.news.sport.#" /> </local-address-policy> <remote-address-policy name="example-remote-address-policy"> <include address-match="queue.usatoday" /> </remote-address-policy> </federation> </amqp-connection> </broker-connections>
相同的参数可在本地和远程地址策略中配置。有效参数有:
- name
-
地址策略的名称。所有地址策略名称必须在 <
broker-connections
> 元素中唯一。> 元素中的 <
federation - max-hops
-
在联邦过程中可以发出的最大跃点数。默认值
0
适用于大多数简单的联邦部署。但是,在某些拓扑中,可能需要一个更大的值来防止消息进行循环。 - auto-delete
-
对于地址联邦,会在消息联邦的代理上创建 durable 队列。将此参数设置为 true,以在启动代理断开连接并满足延迟和消息计数参数后为自动删除标记队列。如果要自动清理动态创建的队列,则此选项是一个非常有用的选项。默认值为
false
,这意味着队列不会被自动删除。 - auto-delete-delay
-
在创建队列前的时间(以毫秒为单位),在启动代理断开连接后具有自动删除的时间(毫秒)。默认值为
0
。 - auto-delete-message-count
-
队列的消息计数必须小于或等于,然后才能自动删除队列。默认值为
0
。 - enable-divert-bindings
-
设置为
true
可允许根据需求侦听 divert 绑定。如果地址与地址策略的包含地址匹配,则任何与 divert 的转发地址匹配的队列绑定都会创建需求。默认值为false
。 - Include
与策略中要包含的地址匹配地址的地址匹配模式。您可以指定多个模式。如果没有指定模式,则所有地址都包含在策略中。
您可以指定一个准确的地址,如
queue.bbc.news
。或者,您可以使用数字符号(#)通配符字符来指定匹配的地址集合。在前面的示例中,本地地址策略还包括以queue.news
字符串开头的所有地址。- exclude
匹配要从策略中排除的地址的 address-match 模式。您可以指定多个模式。如果没有指定模式,策略中没有排除地址。
您可以指定一个准确的地址,如
queue.bbc.news
。或者,您可以使用数字符号(#)通配符字符来指定匹配的地址集合。在前面的示例中,本地地址策略排除以queue.news.sport
字符串开头的所有地址。
-
一个
4.22.4.1.2. 使用 AMQP 配置队列联邦
流程
使用 & lt;broker connections&
gt; 元素为 AMQP 配置队列联邦。
前提条件
< amqp-connection>
; 元素中指定的用户具有与远程代理上地址和队列匹配的读写权限。
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加一个 <
;broker connections>
; 元素,其中包含 <amqp-connection>
; 元素。在 <amqp-connection
> 元素中,指定远程代理的连接详情,并为联邦配置分配一个名称。例如:<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
添加 &
lt;federation
> 元素,并包括以下一个或多个项:-
一个
<local-queue-policy
> 元素,将消息从远程代理到本地代理。 -
一个
<remote-queue-policy
> 元素,将消息从本地代理到远程代理。
以下示例显示了包含本地队列策略的 federation 元素。
<broker-connections> <amqp-connection uri="tcp://HOST:PORT" name="federation-example"> <federation> <local-queue-policy name="example-local-queue-policy"> <include address-match="#" queue-match="#.remote" /> <exclude address-match="#" queue-match="#.local" /> </local-queue-policy> </federation> </amqp-connection> </broker-connections>
- name
-
队列策略的名称。所有队列策略名称必须在 <
broker-connections
> 元素的 <federation
> 元素内唯一。 - Include
-
匹配地址
和队列匹配模式的地址匹配,以匹配
这些地址上的特定队列,以包含在策略中。与address-match
参数一样,您可以指定queue-match
参数的确切名称,也可以使用通配符表达式来指定一组队列。在上例中,包含与所有地址中的.remote
字符串匹配的队列(由address-match
值表示)。 - exclude
-
匹配地址
和队列匹配模式的地址匹配,以匹配
这些地址上的特定队列,以便从策略中排除。与address-match
参数一样,您可以指定queue-match
参数的确切名称,也可以使用通配符表达式来指定一组队列。在前面的示例中,排除在所有地址中与.local
字符串匹配的队列,由address-match
值表示。 - priority-adjustment
-
调整联邦消费者的值,以确保它们的优先级值低于同一队列中其他本地用户的值。默认值为
-1,
这样可确保本地消费者优先于联邦消费者。 - include-federated
当此参数的值设为
false
时,配置不会重新联邦一个已存在的消费者(即联邦队列上的消费者)。这可避免在对称或关闭的拓扑中,没有非联邦消费者和系统的消息流。如果您没有 closed-loop 拓扑,则将此参数设置为
true
。例如,假设您有一个包含三个代理( BrokerA、BrokerB 和 BrokerC)的链,以及 BrokerA 和消费者 at BrokerC 的制作者。在这种情况下,您希望 BrokerB 重新联邦消费者到 BrokerA。
-
一个
4.22.4.2. 使用 Core 协议配置联邦
您可以配置消息和队列联邦以使用 Core 协议。
4.22.4.2.1. 为代理集群配置联邦
下面的部分的示例演示了如何配置 独立 本地和远程代理之间的地址和队列联邦。对于在独立代理间联邦、联邦配置的名称以及任何地址和队列策略的名称,在本地和远程代理之间必须是唯一的。
但是,如果您要在集群中为代理配置联邦,则需要额外的要求。对于集群代理,联邦配置的名称以及该配置中的任何地址和队列策略的名称 对于该集群中的每个代理都必须相同。
确保同一集群中的代理使用相同的联邦配置和地址和队列策略名称避免消息重复。例如,如果同一集群中的代理 有不同的联邦配置名称,这可能会导致为同一地址创建多个不同的 转发队列,从而导致下游用户的消息重复。相反,如果同一集群中的代理 使用相同的 联邦配置名称,这基本上会创建与下游用户进行负载均衡的复制的集群转发队列。这可避免消息重复。
4.22.4.2.2. 配置上游地址联邦
以下示例演示了如何在独立代理之间配置上游地址联邦。在本例中,您要将本地(即 下游)代理中的联邦配置为一些远程(即 上游)代理。
先决条件
- 以下示例演示了如何配置独立代理间的地址联邦。但是,您还应熟悉为代理 集群配置 联邦的要求。更多信息请参阅 第 4.22.4.2.1 节 “为代理集群配置联邦”。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加新的 <
federations>
元素,其中包含 <federation>
元素。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
name
- 联邦配置的名称。在本例中,名称对应于本地代理的名称。
user
- 用于连接到上游代理的共享用户名。
password
- 用于连接到上游代理的共享密码。
注意如果用户和密码凭证与远程代理不同,您可以在将代理添加到配置中时单独指定这些代理的凭证。此流程稍后将对此进行描述。
在
federation
元素中,添加一个 <address-policy>
元素。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> </address-policy> </federation> </federations>
name
- 地址策略的名称。代理上配置的所有地址策略必须具有唯一的名称。
auto-delete
-
在地址联邦过程中,本地代理会在远程地址动态创建持久队列。
auto-delete
属性的值指定在本地代理断开连接后队列是否应该被删除,auto-delete-delay
和auto-delete-message-count
属性的值也已达到。如果要自动清理动态创建的队列,则此选项是一个非常有用的选项。如果您要防止在远程代理长时间断开连接时,在远程代理上构建消息,它也是一个有用的选项。但是,如果您希望消息在本地代理断开连接时始终保持排队,则可能会将此选项设置为false
,从而避免本地代理上的消息丢失。 auto-delete-delay
- 在本地代理断开连接后,此属性的值指定了动态创建的远程队列有资格自动删除的时间(以毫秒为单位)。
auto-delete-message-count
- 在本地代理断开连接后,此属性的值指定了在该队列被自动删除前仍然可以位于动态创建的远程队列中的最大消息数。
enable-divert-bindings
-
将此属性设置为
true
可根据需要侦听分离绑定。如果存在与地址策略包含的地址匹配的解析绑定,则任何与 divert 的转发地址匹配的队列绑定都会创建需求。默认值为false
。 max-hops
- 在联邦过程中可以发出的最大跃点数。特定的拓扑需要此属性的特定值。要了解更多有关这些要求的信息,请参阅 第 4.22.2 节 “用于地址联邦的通用拓扑”。
transformer-ref
- 转换程序配置的名称。如果要在联邦消息传输过程中转换消息,您可以添加转换器配置。此流程稍后会描述转换器配置。
在 <
;address-policy&
gt; 元素中,添加 address-matching 模式,以便从地址策略中包含和排除地址策略。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> </federation> </federations>
Include
-
此元素的
address-match
属性的值指定要包含在地址策略中的地址。您可以指定一个准确的地址,如queue.bbc.new
或queue.usatoday
。或者,您可以使用通配符表达式来指定匹配的地址 集合。在前面的示例中,地址策略还包括以字符串queue.news
开头的所有 地址名称。 exclude
-
此元素的
address-match
属性的值指定要从地址策略中排除的地址。您可以指定一个准确的地址名称,或使用通配符表达式来指定匹配的地址 集合。在前面的示例中,地址策略排除以字符串queue.news.sport
开头的所有 地址名称。
(可选)使用
federation
元素,添加一个transformer
元素来引用自定义转换器。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
name
-
转换程序配置的名称。此名称在本地代理中必须是唯一的。这是您指定为地址策略的
transformer-ref
属性的值的名称。 class-name
实施
org.apache.activemq.artemis.core.server.transformer.Transformer
接口的用户定义的类的名称。在传输消息前,会使用消息调用转换器的
transform ()
方法。这可让您在被联邦前转换消息标头或正文。属性
- 用于保存特定转换器配置的键值对。
在
federation
元素内,添加一个或多个上游
元素。每个upstream
元素都定义了与远程代理的连接,以及应用到该连接的策略。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <upstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <policy ref="news-address-federation"/> </upstream> <upstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <policy ref="news-address-federation"/> </upstream> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
static-connectors
-
包含
connector-ref
元素列表,引用本地代理的broker.xml
配置文件中定义的连接器
元素。连接器定义用于出站连接的传输(TCP、SSL、HTTP 等)和服务器连接参数(主机、端口等)。此流程的下一步演示了如何添加static-connectors
元素中引用的连接器。 policy-ref
- 在应用于上游代理的下游代理上配置的地址策略名称。
您可以为
上游
元素指定的附加选项如下所述:name
-
上游代理配置的名称。在本例中,名称对应于名为
eu-east-1
和eu-west-1
的上游代理。 user
-
创建到上游代理的连接时使用的用户名。如果没有指定,则使用在配置
federation
元素中指定的共享用户名。 password
-
创建到上游代理的连接时使用的密码。如果没有指定,则使用在配置
federation
元素中指定的共享密码。 call-failover-timeout
-
与
call-timeout
类似,但在故障转移尝试期间调用时使用。默认值为-1,
这意味着禁用超时。 call-timeout
-
时间,以毫秒为单位,联邦连接在传输作为阻塞调用的数据包时等待来自远程代理的回复。如果这个时间过,连接会抛出异常。默认值为
30000
。 check-period
-
周期(以毫秒为单位),在本地代理发送到远程代理连续的"keep-alive"消息之间,用于检查联邦连接的健康状态。如果联邦连接处于健康状态,远程代理会响应每个 keep-alive 消息。如果连接不健康,则下游代理无法接收来自上游代理的响应,则使用称为 断路器 的机制来阻止联邦消费者。如需更多信息,请参阅
circuit-breaker-timeout
参数的描述。check-period
参数的默认值为30000
。 circuit-breaker-timeout
- 下游和上游代理之间的单个连接可由许多联邦队列和地址消费者共享。如果代理之间的连接丢失,每个联邦消费者可能会同时尝试重新连接。为避免这种情况,称为 断路器 的机制会阻止使用者。当指定的超时值经过后,断路器会重新记录连接。如果成功,消费者将取消阻塞。否则,断路器再次应用。
connection-ttl
-
以毫秒为单位,如果联邦连接停止从远程代理接收信息,则联邦连接会保持活跃状态。默认值为
60000
。 discovery-group-ref
-
作为定义连接到上游代理的静态连接器的替代选择,此元素可用于指定在
broker.xml
配置文件中已经配置的发现组。具体来说,您可以将现有的发现组指定为此元素的discovery-group-name
属性的值。有关发现组的详情,请参考 第 14.1.6 节 “代理发现方法”。 ha
-
指定是否为与上游代理的连接启用了高可用性。如果此参数的值设为
true
,则本地代理可以连接到上游集群中任何可用代理,并在 live upstream 代理关闭时自动切换到备份代理。默认值为false
。 initial-connect-attempts
-
下游代理将连接到上游代理的初始尝试次数。如果在不建立连接的情况下达到这个值,则上游代理将被视为永久离线。downstream 代理不再将信息路由到上游代理。默认值为
-1,
这意味着没有限制。 max-retry-interval
-
与远程代理连接时,后续重新连接尝试之间的最长时间(以毫秒为单位)。默认值为
2000
。 reconnect-attempts
-
如果连接失败,下游代理将尝试重新连接到上游代理的次数。如果在没有重新建立连接的情况下达到这个值,则上游代理被视为永久离线。downstream 代理不再将信息路由到上游代理。默认值为
-1,
这意味着没有限制。 retry-interval
-
与远程代理的连接失败,在后续重新连接尝试之间周期(以毫秒为单位)。默认值为
500
。 retry-interval-multiplier
-
对应用到
retry-interval
参数的值的多重因素。默认值为:1
。 share-connection
-
如果同一代理配置了一个下游和上游连接,则只要下游和上游配置的值设置为
true
,就会共享同一连接。默认值为false
。
在本地代理中,将连接器添加到远程代理。这些是联邦地址配置的
static-connectors
元素中引用的连接器。例如:<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors>
4.22.4.2.3. 配置下游地址联邦
以下示例演示了如何为独立代理配置下游地址联邦。
下游地址联邦允许您在一个或多个远程代理用来连接到本地代理的本地代理中添加配置。这种方法的优点是您可以在单一代理上保持所有联邦配置。这可能是 hub 和 spoke 拓扑的有用方法,例如:
下游地址联邦会反转联邦连接方向,而不是上游地址配置。因此,当您在配置中添加远程代理时,这些代理被视为 下游 代理。下游代理使用配置中的连接信息来连接回本地代理,这现在被视为上游。本例稍后会演示,当您为远程代理添加配置时。
先决条件
- 您应该熟悉上游地址联邦的配置。请参阅 第 4.22.4.2.2 节 “配置上游地址联邦”。
- 以下示例演示了如何配置独立代理间的地址联邦。但是,您还应熟悉为代理 集群配置 联邦的要求。更多信息请参阅 第 4.22.4.2.1 节 “为代理集群配置联邦”。
流程
-
在本地代理上,打开 <
;broker_instance_dir> /etc/broker.xml
配置文件。 添加包括
<federation>
项的<federations>
项。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
添加地址策略配置。例如:
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" max-hops="1" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> </federation> ... </federations>
如果要在传输前转换信息,请添加转换器配置。例如:
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" max-hops="1" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
为每个远程代理添加
downstream
项。例如:<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <downstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <downstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <address-policy name="news-address-federation" max-hops="1" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
如前面的配置所示,远程代理现在被视为本地代理的下游。下游代理使用配置中的连接信息连接到本地(即 上游)代理。
在本地代理中,添加供本地和远程代理用来建立联邦连接的连接器和接收器。例如:
<connectors> <connector name="netty-connector">tcp://localhost:61616</connector> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors> <acceptors> <acceptor name="netty-acceptor">tcp://localhost:61616</acceptor> </acceptors>
connector name="netty-connector"
- 本地代理发送到远程代理的连接器配置。远程代理使用此配置连接到本地代理。
connector name="eu-west-1-connector"
,connector name="eu-east-1-connector"
- 远程代理连接器。本地代理使用这些连接器来连接到远程代理,并共享远程代理需要连接到本地代理的配置。
acceptor name="netty-acceptor"
- 在本地代理上与远程代理使用的连接器对应的接收器来重新连接到本地代理。
4.22.4.2.4. 关于队列联邦
队列联邦提供了一种方式,在本地代理间平衡单个队列的负载。
为实现负载平衡,本地代理从远程队列检索消息,以满足来自本地使用者的消息的需求。下面是一个示例。
图 4.9. 对称队列联邦

远程队列不需要重新配置,且不必位于同一代理或同一集群中。建立远程链接和联邦队列所需的所有配置都位于本地代理中。
4.22.4.2.4.1. 队列联邦的优点
以下是您可能选择配置队列联邦的一些原因。
- 增加容量
- 队列联邦可以创建在多个代理上分发的"逻辑"队列。这个逻辑分布式队列的容量比单个代理上的单个队列要高。在这个设置中,尽可能多的信息会从最初发布到的代理中消耗。只有在需要负载平衡时,系统才会在联邦中移动消息。
- 部署多区域设置
在多区域设置中,您可能在一个地区或场合中都有一个消息制作者,并在另一个地区和消费者之间有消息生成者。但是,您应该最好将生成者和消费者连接保持本地到给定区域。在这种情况下,您可以在生成者和消费者的每个区域中部署代理,并使用队列联邦在区域间移动消息(WAN)。下面是一个示例。
图 4.10. 多区域队列联邦
- 安全企业 LAN 和 DMZ 间的通信
在网络安全中,demilitarized 区域 (DMZ)是一个物理或逻辑子网,其中包含并公开面向企业的外部服务到不受信任的服务,通常是更大的网络,如互联网。企业的本地区域网络(LAN)的其余部分在防火墙后面保持与这个外部网络隔离。
如果很多消息制作者位于 DMZ 中,且安全企业 LAN 中的许多消费者,则可能不适合生产者连接到安全企业 LAN 中的代理。在这种情况下,您可以在 DMZ 中部署代理,以便生成者可以发布消息。然后,企业 LAN 中的代理可以连接到 DMZ 中的代理,并使用联邦队列从 DMZ 中的代理接收信息。
4.22.4.2.5. 配置上游队列联邦
以下示例演示了如何为独立代理配置上游队列联邦。在本例中,您要将本地(即 下游)代理中的联邦配置为一些远程(即 上游)代理。
先决条件
- 以下示例演示了如何配置独立代理间的队列联邦。但是,您还应熟悉为代理 集群配置 联邦的要求。更多信息请参阅 第 4.22.4.2.1 节 “为代理集群配置联邦”。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在新的 <
federations> 元素中
,添加一个 <federation>
元素。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
name
- 联邦配置的名称。在本例中,名称对应于下游代理的名称。
user
- 用于连接到上游代理的共享用户名。
password
- 用于连接到上游代理的共享密码。
注意- 如果用户和密码凭证与上游代理不同,您可以在将代理添加到配置中时单独指定这些代理的凭证。此流程稍后将对此进行描述。
在
federation
元素中,添加一个 <queue-policy>
元素。为 <queue-policy&
gt; 元素的属性指定值。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> </queue-policy> </federation> </federations>
name
- 队列策略的名称。代理上配置的所有队列策略必须具有唯一的名称。
include-federated
当此属性的值设为
false
时,配置不会重新联邦一个已联邦消费者(即联邦队列上的消费者)。这可避免在对称或关闭的拓扑中,没有非联邦消费者,且系统无消息流。如果您没有 closed-loop 拓扑,则可以将此属性的值设置为
true
。例如,假设您有以下三个代理链:BrokerA
、BrokerB
和BrokerC
,以及BrokerA
和消费者位于BrokerC
的制作者。在这种情况下,您将希望BrokerB
重新联邦消费者到BrokerA
。priority-adjustment
当消费者连接到队列时,其优先级在创建上游(即 联邦)消费者时使用。联邦消费者的优先级由
priority-adjustment
属性的值调整。此属性的默认值为-1,
可确保本地消费者在负载均衡期间优先于联邦消费者。但是,您可以根据需要更改优先级调整的值。如果优先级调整不足,以防止太多消息移至联邦消费者,这可能会导致消息在代理之间移动,您可以限制移到联邦消费者的消息批处理大小。要限制批处理大小,请在联邦消费者的连接 URI 上将
consumerWindowSize
值设置为0。
tcp://<host>:<port>?consumerWindowSize=0
将
consumerWindowSize
值设置为0
时,AMQ Broker 使用匹配地址的地址设置中的defaultConsumerWindowSize
参数的值来确定可以在代理之间移动的批处理信息。defaultConsumerWindowSize
属性的默认值为1048576
字节。transformer-ref
- 转换程序配置的名称。如果要在联邦消息传输过程中转换消息,您可以添加转换器配置。此流程稍后会描述转换器配置。
在 <
;queue-policy&
gt; 元素中,添加 address-matching 模式,使其包含和排除来自队列策略的地址。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> </federation> </federations>
Include
此元素的
address-match
属性的值指定要包含在队列策略中的地址。您可以指定一个准确的地址,如queue.bbc.new
或queue.usatoday
。或者,您可以使用通配符表达式来指定匹配的地址 集合。在前面的示例中,队列策略还包含以字符串queue.news
开头的所有 地址名称。与
address-match
属性结合使用,您可以使用queue-match
属性在队列策略中包含这些地址的特定队列。与address-match
属性一样,您可以指定准确的队列名称,也可以使用通配符表达式来指定 一组 队列。在前面的示例中,数字符号 (#
) 通配符代表在每个地址或包括在队列策略中的一组地址中的所有队列。exclude
-
此元素的
address-match
属性的值指定要从队列策略中排除的地址。您可以指定一个准确的地址,或使用通配符表达式来指定匹配的地址 集合。在前面的示例中,数字符号(#
)通配符表示排除任何匹配跨越 所有地址中的queue-match
属性的队列。在这种情况下,任何以字符串.local
结尾的队列都会被排除。这表示某些队列保持为本地队列,而不是联合。
在
federation
元素中,添加一个transformer
元素来引用自定义转换器实现。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
name
-
转换程序配置的名称。此名称在有问题的代理上必须是唯一的。您可以将此名称指定为地址策略的
transformer-ref
属性的值。 class-name
实施
org.apache.activemq.artemis.core.server.transformer.Transformer
接口的用户定义的类的名称。在传输消息前,会使用消息调用转换器的
transform ()
方法。这可让您在被联邦前转换消息标头或正文。属性
- 用于保存特定转换器配置的键值对。
在
federation
元素内,添加一个或多个上游
元素。每个upstream
元素都定义了一个上游代理连接,以及用于应用到该连接的策略。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <upstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <policy ref="news-queue-federation"/> </upstream> <upstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <policy ref="news-queue-federation"/> </upstream> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
static-connectors
-
包含
connector-ref
元素列表,引用本地代理的broker.xml
配置文件中定义的连接器
元素。连接器定义用于出站连接的传输(TCP、SSL、HTTP 等)和服务器连接参数(主机、端口等)。此步骤的以下步骤演示了如何添加联邦队列配置的static-connectors
元素引用的连接器。 policy-ref
- 在应用于上游代理的下游代理上配置的队列策略名称。
您可以为
上游
元素指定的附加选项如下所述:name
-
上游代理配置的名称。在本例中,名称对应于名为
eu-east-1
和eu-west-1
的上游代理。 user
-
创建到上游代理的连接时使用的用户名。如果没有指定,则使用在配置
federation
元素中指定的共享用户名。 password
-
创建到上游代理的连接时使用的密码。如果没有指定,则使用在配置
federation
元素中指定的共享密码。 call-failover-timeout
-
与
call-timeout
类似,但在故障转移尝试期间调用时使用。默认值为-1,
这意味着禁用超时。 call-timeout
-
时间,以毫秒为单位,联邦连接在传输作为阻塞调用的数据包时等待来自远程代理的回复。如果这个时间过,连接会抛出异常。默认值为
30000
。 check-period
-
周期(以毫秒为单位),在本地代理发送到远程代理连续的"keep-alive"消息之间,用于检查联邦连接的健康状态。如果联邦连接处于健康状态,远程代理会响应每个 keep-alive 消息。如果连接不健康,则下游代理无法接收来自上游代理的响应,则使用称为 断路器 的机制来阻止联邦消费者。如需更多信息,请参阅
circuit-breaker-timeout
参数的描述。check-period
参数的默认值为30000
。 circuit-breaker-timeout
- 下游和上游代理之间的单个连接可由许多联邦队列和地址消费者共享。如果代理之间的连接丢失,每个联邦消费者可能会同时尝试重新连接。为避免这种情况,称为 断路器 的机制会阻止使用者。当指定的超时值经过后,断路器会重新记录连接。如果成功,消费者将取消阻塞。否则,断路器再次应用。
connection-ttl
-
以毫秒为单位,如果联邦连接停止从远程代理接收信息,则联邦连接会保持活跃状态。默认值为
60000
。 discovery-group-ref
-
作为定义连接到上游代理的静态连接器的替代选择,此元素可用于指定在
broker.xml
配置文件中已经配置的发现组。具体来说,您可以将现有的发现组指定为此元素的discovery-group-name
属性的值。有关发现组的详情,请参考 第 14.1.6 节 “代理发现方法”。 ha
-
指定是否为与上游代理的连接启用了高可用性。如果此参数的值设为
true
,则本地代理可以连接到上游集群中任何可用代理,并在 live upstream 代理关闭时自动切换到备份代理。默认值为false
。 initial-connect-attempts
-
下游代理将连接到上游代理的初始尝试次数。如果在不建立连接的情况下达到这个值,则上游代理将被视为永久离线。downstream 代理不再将信息路由到上游代理。默认值为
-1,
这意味着没有限制。 max-retry-interval
-
与远程代理连接时,后续重新连接尝试之间的最长时间(以毫秒为单位)。默认值为
2000
。 reconnect-attempts
-
如果连接失败,下游代理将尝试重新连接到上游代理的次数。如果在没有重新建立连接的情况下达到这个值,则上游代理被视为永久离线。downstream 代理不再将信息路由到上游代理。默认值为
-1,
这意味着没有限制。 retry-interval
-
与远程代理的连接失败,在后续重新连接尝试之间周期(以毫秒为单位)。默认值为
500
。 retry-interval-multiplier
-
对应用到
retry-interval
参数的值的多重因素。默认值为:1
。 share-connection
-
如果同一代理配置了一个下游和上游连接,则只要下游和上游配置的值设置为
true
,就会共享同一连接。默认值为false
。
在本地代理中,将连接器添加到远程代理。这些是联邦地址配置的
static-connectors
元素中引用的连接器。例如:<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors>
注意如果您希望大型消息在联邦连接之间流,在用于联邦连接的连接器中将
consumerWindowSize
参数设置为 -1。将consumerWindowSize
参数设置为 -1 表示没有为此参数设置限制,这将允许大型消息跨连接流。例如:<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616?consumerWindowSize=-1</connector> <connector name="eu-east-1-connector">tcp://localhost:61617?consumerWindowSize=-1</connector> </connectors>
有关大型信息的详情,请参考 第 8 章 处理大型消息。
4.22.4.2.6. 配置下游队列联邦
以下示例演示了如何配置下游队列联邦。
下游队列联邦允许您在一个或多个远程代理用来连接到本地代理的本地代理中添加配置。这种方法的优点是您可以在单一代理上保持所有联邦配置。这可能是 hub 和 spoke 拓扑的有用方法,例如:
下游队列联邦联邦联邦连接与上游队列配置方向相反。因此,当您在配置中添加远程代理时,这些代理被视为 下游 代理。下游代理使用配置中的连接信息来连接回本地代理,这现在被视为上游。本例稍后会演示,当您为远程代理添加配置时。
先决条件
- 您应该熟悉上游队列联邦的配置。请参阅 第 4.22.4.2.5 节 “配置上游队列联邦”。
- 以下示例演示了如何配置独立代理间的队列联邦。但是,您还应熟悉为代理 集群配置 联邦的要求。更多信息请参阅 第 4.22.4.2.1 节 “为代理集群配置联邦”。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加包括
<federation>
项的<federations>
项。例如:<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
添加队列策略配置。例如:
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" priority-adjustment="-5" include-federated="true" transformer-ref="new-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> </federation> ... </federations>
如果要在传输前转换信息,请添加转换器配置。例如:
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" priority-adjustment="-5" include-federated="true" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
为每个远程代理添加
downstream
项。例如:<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <downstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <downstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <queue-policy name="news-queue-federation" priority-adjustment="-5" include-federated="true" transformer-ref="new-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
如前面的配置所示,远程代理现在被视为本地代理的下游。下游代理使用配置中的连接信息连接到本地(即 上游)代理。
在本地代理中,添加供本地和远程代理用来建立联邦连接的连接器和接收器。例如:
<connectors> <connector name="netty-connector">tcp://localhost:61616</connector> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors> <acceptors> <acceptor name="netty-acceptor">tcp://localhost:61616</acceptor> </acceptors>
connector name="netty-connector"
- 本地代理发送到远程代理的连接器配置。远程代理使用此配置连接到本地代理。
connector name="eu-west-1-connector"
,connector name="eu-east-1-connector"
- 远程代理连接器。本地代理使用这些连接器来连接到远程代理,并共享远程代理需要连接到本地代理的配置。
acceptor name="netty-acceptor"
在本地代理上与远程代理使用的连接器对应的接收器来重新连接到本地代理。
注意如果您希望大型消息在联邦连接之间流,在用于联邦连接的连接器中将
consumerWindowSize
参数设置为 -1。将consumerWindowSize
参数设置为 -1 表示没有为此参数设置限制,这将允许大型消息跨连接流。例如:<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616?consumerWindowSize=-1</connector> <connector name="eu-east-1-connector">tcp://localhost:61617?consumerWindowSize=-1</connector> </connectors>
有关大型信息的详情,请参考 第 8 章 处理大型消息。