4.22. 联邦地址和队列
Federation 支持在代理间传输消息,而无需代理位于一个通用集群中。代理可以独立使用,也可以在单独的集群中。另外,源和目标代理可以位于不同的管理域中,这意味着代理可能具有不同的配置、用户和安全设置。代理甚至可能会使用不同的 AMQ Broker 版本。
例如,联邦适合可靠地将信息从一个集群发送到另一个集群。这种传输可能会跨越广域网(WAN)、云基础架构的区域或互联网。如果从源代理连接到目标代理的连接丢失(例如,因为网络失败),则源代理会尝试重新建立连接,直到目标代理重新上线为止。当目标代理重新上线时,消息传输将恢复。
管理员可以使用地址和队列策略来管理联邦。策略配置可以匹配到特定的地址或队列,或者策略可以包含与一组地址或队列匹配的通配符表达式。因此,联邦可以动态应用,作为队列或地址被添加到匹配集合中,或从匹配的集合中删除。策略 可以包含多个 表达式,其中包括和/或排除特定地址和队列。另外,多个策略可以应用到代理或代理集群。
在 AMQ Broker 中,两个主要的联邦选项是 address federation 和 queue federation。这些选项在后续小节中进行了描述。
代理可以包含联邦 和本地 组件的配置。也就是说,如果您在代理中配置联邦,则不需要协调该代理上的所有内容。
4.22.1. 关于地址联邦
地址联邦类似于连接的代理之间的完整多播分布模式。例如,发送到 BrokerA
上地址的每个消息都会被传送到该代理上的每个队列。另外,每个消息都传送到 BrokerB
,所有附加队列都在其中发送。
地址联邦动态将代理链接到远程代理中的地址。例如,如果本地代理希望从远程代理上的地址获取消息,则会在远程地址上自动创建队列。然后,远程代理上的消息会被消耗给此队列。最后,消息被复制到本地代理的对应地址,就像最初被直接发布到本地地址一样。
不需要重新配置远程代理来允许联邦在其上创建地址。但是,本地 代理需要被授予远程地址的权限。
4.22.2. 地址联邦的常见拓扑
下面介绍了一些使用地址联邦的拓扑。
- 对称拓扑
在对称拓扑中,生成者和消费者连接到每个代理。队列及其消费者可以接收由任一制作者发布的消息。下方显示了一个对称拓扑示例。
图 4.1. 对称拓扑中的地址联邦
为对称拓扑配置地址联邦时,必须将地址策略的
max-hops
属性的值设置为1
。这样可确保消息 仅复制一次,避免了 cyclic 复制。如果此属性设置为较大的值,则消费者会收到同一消息的多个副本。- 完整网格拓扑
完整的网格拓扑与对称设置类似。三个或更多代理相互对称,创建一个完整的网格。在这个设置中,生产者和消费者连接到每个代理。队列及其消费者可以接收任何制作者发布的消息。此拓扑的示例如下所示。
图 4.2. 完整网格拓扑中的地址联邦
与对称设置一样,当为完整网格拓扑配置地址联邦时,必须将地址策略的
max-hops
属性的值设置为1
。这样可确保消息 仅复制一次,避免了 cyclic 复制。- 环环拓扑
在代理环中,每个联邦地址都是上游的。此拓扑的示例如下所示。
图 4.3. 环拓扑中的地址联邦
当您为环拓扑配置联邦时,为了避免 cyclic 复制,必须将地址策略的
max-hops
属性设置为n-1
,其中 n 是环中的节点数。例如,在上面显示的环拓扑中,max-hops
的值设置为5
。这样可确保环中的每个地址都 完全看到一次 消息。环环拓扑的优点是,根据您需要进行的物理连接数量,设置更便宜。但是,这种类型的拓扑缺陷是,如果单个代理失败,整个环会失败。
- fan-out 拓扑
在 fan-out 拓扑中,单个 master 地址被联邦地址的树链接到。发布到 master 地址的任何消息都可以被连接到树中任何代理的消费者接收。树可以配置为任何深度。树也可以扩展,而无需在树中重新配置现有代理。此拓扑的示例如下所示。
图 4.4. fan-out 拓扑中的地址联邦
当您为 fan-out 拓扑配置联邦时,请确保将地址策略的
max-hops
属性设置为n-1
,其中 n 是树中的级别数。例如,在上面显示的 fan-out 拓扑中,max-hops
的值设置为2
。这样可确保树中的每个地址都 完全看到一次 消息。
4.22.3. 支持在地址联邦配置中有 disrt 绑定
在配置地址联邦时,您可以在地址策略配置中添加对 disrt 绑定的支持。添加此支持可让联邦响应在远程代理上为给定地址创建联邦消费者。
例如,假设地址策略中包含了一个名为 test.federation.source
的地址,另一个名为 test.federation.target
的地址。通常,当一个队列在 test.federation.target
上创建,不会导致创建联邦消费者,因为地址不是地址策略的一部分。但是,如果您创建了一个离散的绑定,以便 test.federation.source
是源地址,test.federation.target
是转发地址,那么会在转发地址中创建具有危险的消费者。源地址仍然必须使用 multicast
路由类型,但目标地址可以使用 multicast
或 anycast
。
示例用例是将 JMS 主题(多播地址
)重定向到 JMS 队列(anycast
地址)。这启用了在主题上对不支持 JMS 2.0 和共享订阅的传统消费者进行负载平衡。
4.22.4. 为代理配置联邦
以下章节中的示例演示了如何配置 独立 本地和远程代理间的地址和队列联邦。对于独立代理、联邦配置的名称以及任何地址和队列策略的名称,在本地和远程代理之间必须是唯一的。
但是,如果您要在集群中为代理配置联邦,则需要额外的要求。对于集群代理,联邦配置的名称以及该配置中任何地址和队列策略的名称 对于该集群中的每个代理都必须相同。
确保同一集群中的代理使用相同的联邦配置和地址和队列策略名称,避免消息重复。例如,如果同一集群中的代理 有不同的 联邦配置名称,这可能会导致为同一地址创建多个命名的转发队列,从而导致下游用户的消息重复。相反,如果同一集群中的代理 使用相同的 联邦配置名称,这基本上会创建复制到下游消费者的复制的集群转发队列。这可避免消息重复。
4.22.5. 配置上游地址联邦
以下示例演示了如何配置独立代理间的上游地址联邦。在本例中,您可以将一个本地的联邦(即 下游)代理配置为一些远程(即 上游)代理。
先决条件
- 以下示例演示了如何配置独立代理间的地址联邦。但是,您还应熟悉为代理配置联邦 的要求。更多信息请参阅 第 4.22.4 节 “为代理配置联邦”。
流程
-
打开 &
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
可让 disrt 绑定根据需要侦听。如果存在与地址策略包含的地址匹配的地址绑定,则任何与 divert 转发地址匹配的队列绑定都会满足需求。默认值为false
。 max-hops
- 消息可以在联邦期间进行的最大跃点数。特定的拓扑需要此属性的特定值。要了解更多有关这些要求的信息,请参阅 第 4.22.2 节 “地址联邦的常见拓扑”。
transformer-ref
- 转换程序配置的名称。如果要在联邦消息传输过程中转换消息,您可以添加转换器配置。此流程稍后会描述转换器配置。
在 <
;address-policy
> 元素中,添加与地址策略包含和排除地址的 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
接口的用户定义的类的名称。转换程序的 convert ()
方法在传输消息之前通过消息调用。这可让您在联邦前转换消息标头或正文。属性
- 用于为特定转换器配置保存键值对。
在
federation
元素中,添加一个或多个upstream
元素。每个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 信息。如果连接不健康,当下游代理无法从上游代理接收响应时,会使用一个名为 断路器 的机制阻止联邦用户。如需更多信息,请参阅
breaker-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 上游代理关闭时自动切换到备份代理。默认值为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.6. 配置下游地址联邦
以下示例演示了如何为独立代理配置下游地址联邦。
下游地址联邦允许您在一个或多个远程代理用来连接到本地代理的本地代理中添加配置。这种方法的优点是您可以在单个代理上保留所有联邦配置。这可能是 hub 和 spoke 拓扑的一个有用方法,例如:
下游地址联邦将联邦连接方向与上游地址配置相反。因此,当您在配置中添加远程代理时,它们被视为 下游 代理。下游代理使用配置中的连接信息来连接本地代理,现在被视为上游。本例稍后会演示,当您为远程代理添加配置时。
先决条件
- 您应该熟悉上游地址联邦的配置。请参阅 第 4.22.5 节 “配置上游地址联邦”。
- 以下示例演示了如何配置独立代理间的地址联邦。但是,您还应熟悉为代理配置联邦 的要求。更多信息请参阅 第 4.22.4 节 “为代理配置联邦”。
流程
-
在本地代理中,打开 <
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"
- 本地代理发送到远程代理的连接器配置。远程代理使用此配置回本地代理。
连接器名称="eu-west-1-connector"
,connector name="eu-east-1-connector"
- 连接器到远程代理。本地代理使用这些连接器连接到远程代理,并共享远程代理连接回本地代理所需的配置。
acceptor name="netty-acceptor"
- 与远程代理用来连接到本地代理的连接器对应的本地代理上的 acceptor。
4.22.7. 关于队列联邦
队列联邦提供了一种在其他远程代理的本地代理上平衡单个队列负载的方法。
为了实现负载平衡,本地代理从远程队列检索消息,以满足来自本地消费者的消息需求。下面是一个示例。
图 4.5. 对称队列联邦
远程队列不需要重新配置,且不必在同一代理或同一集群中。建立远程链接和联邦队列所需的所有配置都位于本地代理上。
4.22.7.1. 队列联邦的优点
以下是您可能选择配置队列联邦的一些原因。
- 增加容量
- 队列联邦可以创建在多个代理上分发的"逻辑"队列。这个逻辑分布式队列的容量比单个代理中有一个队列要高。在这个设置中,尽可能多的信息会从最初发布到的代理中消耗。只有在需要负载平衡时,系统才会将消息移到联邦中。
- 部署多区域设置
在多区域设置中,您可能有一个消息制作者(region)或 venue,另一个地区(consumer)中有一个消息制作者。但是,您理想情况下,将生成者和消费者连接保留在给定区域。在这种情况下,您可以在生产者和消费者所在的每个区域中部署代理,并使用队列联邦在区域间移动消息。下面是一个示例。
图 4.6. 多区域队列联邦
- 安全企业 LAN 和 DMZ 之间的通信
在网络安全中,非企业化区域 (DMZ)是一个物理或逻辑公司,其中包含并公开面向企业的外部服务到不受信任的网络,通常是互联网等。企业局域网(LAN)的剩余部分在防火墙后仍与这个外部网络隔离。
如果很多消息制作者位于 DMZ 中,以及安全企业 LAN 中的多个消费者,则可能无法允许制作者连接到安全企业 LAN 中的代理。在这种情况下,您可以在 DMZ 中部署代理,供制作者发布消息。然后,企业 LAN 中的代理可以连接到 DMZ 中的代理,并使用联邦队列从 DMZ 中的代理接收信息。
4.22.8. 配置上游队列联邦
以下示例演示了如何为独立代理配置上游队列联邦。在本例中,您可以将一个本地的联邦(即 下游)代理配置为一些远程(即 上游)代理。
先决条件
- 以下示例演示了如何配置独立代理间的队列联邦。但是,您还应熟悉为代理配置联邦 的要求。更多信息请参阅 第 4.22.4 节 “为代理配置联邦”。
流程
-
打开 &
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
时,配置不会重新联邦消费者(即联邦队列上的消费者)。这可避免在对称或关闭循环拓扑中,没有非联邦消费者,以及消息流不当于系统的情况。如果您没有 关闭循环拓扑,您可以将此属性的值设置为
true
。例如,假设您有三个代理、BrokerA
、BrokerB
和BrokerC
的链,以及BrokerA
的生成者以及BrokerC
的消费者。在这种情况下,您将希望BrokerB
重新联邦消费者到BrokerA
。priority-adjustment
-
当消费者连接到队列时,在创建上游( 联邦)消费者时使用其优先级。联邦消费者的优先级根据
priority-adjustment
属性的值调整。此属性的默认值为-1,
这样可确保本地消费者在负载平衡期间优先于联邦消费者。但是,您可以根据需要更改优先级调整的值。
如果只为本地消费者提供优先权,联邦消费者使用消息的速度导致太多消息被移到联邦消费者,但您可以限制联邦消费者消耗消息的速率。要限制消息消耗率,请在联邦用户的客户端连接 URI 中配置 consumerMaxRate
流控制选项。如需更多信息,请参阅 AMQ Core Protocol JMS Client 文档中的流控制选项。
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
接口的用户定义的类的名称。转换程序的 convert ()
方法在传输消息之前通过消息调用。这可让您在联邦前转换消息标头或正文。属性
用于为特定转换器配置保存键值对。
在
federation
元素中,添加一个或多个upstream
元素。每个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 信息。如果连接不健康,当下游代理无法从上游代理接收响应时,会使用一个名为 断路器 的机制阻止联邦用户。如需更多信息,请参阅
breaker-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 上游代理关闭时自动切换到备份代理。默认值为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.9. 配置下游队列联邦
以下示例演示了如何配置下游队列联邦。
下游队列联邦允许您在一个或多个远程代理用来连接本地代理的本地代理中添加配置。这种方法的优点是您可以在单个代理上保留所有联邦配置。这可能是 hub 和 spoke 拓扑的一个有用方法,例如:
下游队列联邦将联邦连接方向与上游队列配置相反。因此,当您在配置中添加远程代理时,它们被视为 下游 代理。下游代理使用配置中的连接信息来连接本地代理,现在被视为上游。本例稍后会演示,当您为远程代理添加配置时。
先决条件
- 您应该熟悉上游队列联邦的配置。请参阅 第 4.22.8 节 “配置上游队列联邦”。
- 以下示例演示了如何配置独立代理间的队列联邦。但是,您还应熟悉为代理配置联邦 的要求。更多信息请参阅 第 4.22.4 节 “为代理配置联邦”。
流程
-
打开 &
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"
- 与远程代理用来连接到本地代理的连接器对应的本地代理上的 acceptor。