4.22. 迭代地址和队列
联邦支持在代理间传输消息,而无需代理位于通用集群中。代理可以独立,也可以在单独的集群中。另外,源和目标代理可以位于不同的管理域中,这意味着代理可能具有不同的配置、用户和安全设置。代理甚至可能会使用不同的 AMQ Broker 版本。
例如,联邦适合将信息从一个集群可靠地发送到另一个集群。这种传输可能会跨越广域网(WAN)、云基础架构的区域或互联网。如果从源代理连接到目标代理会丢失(例如,由于网络故障),则源代理会尝试重新建立连接,直到目标代理重新在线为止。当目标代理重新上线时,消息传输会恢复。
管理员可以使用地址和队列策略来管理联邦。策略配置可以匹配到特定的地址或队列,或者策略可以包含与一组地址或队列匹配的通配符表达式。因此,联邦可以动态应用,作为队列或地址被添加到匹配集合中,或从匹配的集合中删除。策略 可以包含多个 表达式,其中包括 和/或排除特定地址和队列。另外,多个策略可应用到代理或代理集群。
在 AMQ Broker 中,两个主要的联邦选项是 address federation 和 queue federation。这些选项在后续小节中进行了描述。
代理可以包含联邦 和 仅本地组件的配置。也就是说,如果您在代理中配置联邦,则不需要联合该代理上的所有内容。
4.22.1. 关于地址联邦 复制链接链接已复制到粘贴板!
地址联邦类似于连接的代理之间的完整多播分布模式。例如,发送到 BrokerA
上地址的每个消息都传送到该代理上的每个队列。另外,每个信息都会传送到 BrokerB
,所有附加队列都会被发送。
地址联邦动态将代理链接到远程代理中的地址。例如,如果本地代理希望从远程代理上的地址获取信息,则会在远程地址上自动创建队列。然后,远程代理上的消息会应用到此队列。最后,消息被复制到本地代理上的对应地址,因为它们最初直接发布到本地地址。
远程代理不需要重新配置,以允许联邦在其上创建地址。但是,本地 代理需要为远程地址授予权限。
4.22.2. 地址联邦的通用拓扑 复制链接链接已复制到粘贴板!
下面介绍了一些使用地址联邦的拓扑。
- 对称拓扑
在对称拓扑中,生成者和消费者连接到每个代理。队列及其消费者可以接收由任一制作者发布的消息。对称拓扑的示例如下所示:
图 4.5. 在对称拓扑中的地址联邦
为对称拓扑配置地址联邦时,必须将地址策略的
max-hops
属性的值设置为1
。这样可确保 仅复制一次 消息,避免了循环复制。如果此属性设置为较大的值,则消费者将接收同一消息的多个副本。- 完整网格拓扑
完整的网格拓扑与对称设置类似。三个或者多个代理相互连接,从而创建一个完整的网格。在这个设置中,生成者和消费者连接到每个代理。队列及其消费者可以接收任何制作者发布的消息。此拓扑示例如下所示。
图 4.6. 在完整网格拓扑中地址联邦
与对称设置一样,当为完整网格拓扑配置地址联邦时,务必要将地址策略的
max-hops
属性的值设置为1
。这样可确保 仅复制一次 消息,避免了循环复制。- Ring 拓扑
在代理环中,每个联邦地址仅在环中只是另一个地址。此拓扑示例如下所示。
图 4.7. 在环拓扑中的地址联邦
当您为环拓扑配置联邦时,为了避免 cyclic 复制,务必要将地址策略的
max-hops
属性设置为n-1
的值,其中 n 是环中节点的数量。例如,在上面显示的环拓扑中,max-hops
的值设为5
。这样可确保环中的每个地址都会 精确看到消息一次。环拓扑的优点在于,根据您需要进行的物理连接数,它更便宜。但是,这种类型的拓扑的缺陷在于,如果单个代理失败,则整个环会失败。
- fan-out 拓扑
在 fan-out 拓扑中,单个主地址由联邦地址树链接。发布到主地址的任何消息都可以被连接到树中的任何代理接收。树可以配置为任何深度。树也可扩展,无需在树中重新配置现有代理。此拓扑示例如下所示。
图 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
。
示例用例是将 JMS 主题(多播地址
)重定向到 JMS 队列(任播地址)的 divert。这可实现传统消费者不支持 JMS 2.0 和共享订阅的主题上消息的负载平衡。
4.22.4. 配置联邦 复制链接链接已复制到粘贴板!
您可以使用 Core 协议或从 7.12、AMQP 开始配置地址和队列联合。使用 AMQP 进行联邦提供以下优点:
- 如果客户端使用 AMQP 进行消息传递,使用 AMQP 进行联邦消除了在 AMQP 和核心协议之间转换消息的需求,反之亦然,如果联邦使用 Core 协议,则需要它。
- AMQP 联邦支持在单个传出连接上双向联合。这消除了远程代理需要重新连接到本地代理的需求,这是当您使用 Core 协议进行联邦时的要求,网络策略可能会阻止它们。
4.22.4.1. 使用 AMQP 配置联邦 复制链接链接已复制到粘贴板!
您可以使用以下策略来使用 AMQP 配置地址和队列联邦:
- 本地地址策略将本地代理配置为监视对地址的需求,并在该需求存在时,在远程代理上的匹配地址上创建一个联合消费者,以联合信息到本地代理。
- 远程地址策略将远程代理配置为监视地址的需求,并在该需求存在时,在本地代理上的匹配地址上创建一个联合消费者,来联合远程代理的消息。
- 本地队列策略将本地代理配置为监视队列的需求,并在该需求存在时,在远程代理上的匹配队列上创建联合消费者,以联合消息到本地代理。
- 远程队列策略将远程代理配置为监视队列的需求,并在该需求存在时,在本地代理上的匹配队列上创建一个联合消费者,以联合消息到远程代理。
远程地址和队列策略发送到远程代理,并在远程代理中成为本地策略,以提供反向联邦连接。在为反向联邦连接应用策略时,接收策略的代理是本地代理,发送策略的代理是远程代理。通过在本地代理中配置远程地址和队列策略,您可以在单个代理上保留所有联邦配置,例如,这可能是 hub 和spoke 拓扑的一个有用方法。
4.22.4.1.1. 使用 AMQP 配置地址联邦 复制链接链接已复制到粘贴板!
使用 & lt;broker-connections&
gt; 元素使用 AMQP 配置地址联邦。
前提条件
< amqp-connection>
; 元素中指定的用户具有匹配远程代理上的地址和队列的读写权限。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加包含 &
lt;
元素。在 &amqp-connection> 元素的 <broker connections
>lt;amqp-connection
> 元素中,指定远程代理的连接详情,并为联邦配置分配一个名称。例如:<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加 &
lt;federation
> 元素,并包括以下内容之一:-
一个
<local-address-policy
> 元素,用于联合来自远程代理的信息到本地代理。 -
&
lt;remote-address-policy
> 元素用于联邦来自本地代理的信息到远程代理。
以下示例显示了带有本地和远程地址策略的联邦元素。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 同一参数可以在本地和远程地址策略中配置。有效参数有:
- name
-
地址策略的名称。所有地址策略名称必须在 <
broker-connections
> 元素中的 <federation
> 元素内唯一。 - max-hops
-
消息在联邦期间可以进行的最大跃点数。默认值
0
适合大多数简单的联邦部署。但是,在某些拓扑中,可能需要更大的值来防止消息循环。 - auto-delete
-
对于地址联邦,会在代理上创建持久化队列,其中消息被联邦。将此参数设置为 true,以在启动代理断开连接后标记自动删除的队列,并满足延迟和消息计数参数。如果要自动清理动态创建的队列,这个选项是一个有用的选项。默认值为
false
,这意味着队列不会被自动删除。 - auto-delete-delay
-
在启动代理断开连接后,创建队列有资格自动删除前的时间(毫秒)。默认值为
0
。 - auto-delete-message-count
-
队列的消息计数必须小于或等于队列之前,才能自动删除队列。默认值为
0
。 - enable-divert-bindings
-
将 设置为
true
可让 divert 绑定被侦听。如果地址的 divert 绑定与地址策略包含的地址匹配,则任何与 divert 的转发地址匹配的队列绑定都会创建需求。默认值为false
。 - Include
匹配策略中要包含的地址的地址的匹配模式。您可以指定多个模式。如果没有指定模式,则策略中的所有地址都包含在策略中。
您可以指定一个准确的地址,如
queue.bbc.news
。或者,您可以使用数字符号(TALM)通配符字符来指定匹配的地址集合。在前面的示例中,本地地址策略还包含以queue.news
字符串开头的所有地址。- exclude
匹配从策略中排除的地址的地址匹配模式。您可以指定多个模式。如果没有指定模式,策略中没有包括任何地址。
您可以指定一个准确的地址,如
queue.bbc.news
。或者,您可以使用数字符号(TALM)通配符字符来指定匹配的地址集合。在前面的示例中,本地地址策略排除以queue.news.sport
字符串开头的所有地址。
-
一个
4.22.4.1.2. 使用 AMQP 配置队列联邦 复制链接链接已复制到粘贴板!
流程
使用 & lt;broker connections&
gt; 元素为 AMQP 配置队列联邦。
前提条件
< amqp-connection>
; 元素中指定的用户具有匹配远程代理上的地址和队列的读写权限。
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 添加包含 &
lt;
元素。在 &amqp-connection> 元素的 <broker connections
>lt;amqp-connection
> 元素中,指定远程代理的连接详情,并为联邦配置分配一个名称。例如:<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加 &
lt;federation
> 元素,并包括以下内容之一:-
一个
<local-queue-policy
> 元素来联邦来自远程代理的信息到本地代理。 -
&
lt;remote-queue-policy
> 元素用于联邦来自本地代理的信息到远程代理。
以下示例显示了包含本地队列策略的联邦元素。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - name
-
队列策略的名称。所有队列策略名称必须在 <
broker-connections
> 元素的 <federation
> 元素内唯一。 - Include
-
匹配地址
和队列
匹配模式的地址匹配模式,以匹配这些地址上的特定队列,以包含在策略中。与address-match
参数一样,您可以为queue-match
参数指定一个准确的名称,或者您可以使用通配符表达式来指定一组队列。在上例中,包含在所有地址间与.remote
字符串匹配的
队列(由地址匹配值#
表示)。 - exclude
-
用于匹配地址
和队列匹配模式的地址匹配模式,以匹配
这些地址上的特定队列,以便从策略中排除。与address-match
参数一样,您可以为queue-match
参数指定一个准确的名称,或者您可以使用通配符表达式来指定一组队列。在上例中,排除在所有地址间与.local
字符串匹配的队列(由地址匹配
值#
表示)被排除。 - priority-adjustment
-
调整联合消费者的值,以确保它们的优先级低于同一队列上的其他本地用户。默认值为
-1
,这样可确保本地消费者的优先级高于联邦消费者。 - include-federated
当此参数的值设置为
false
时,配置不会重新联邦已经被联邦的消费者(即联邦队列中的消费者)。这可避免发生在对称或闭环拓扑中,没有非联邦消费者和系统间的消息流。如果您没有闭循环拓扑,您可以将此参数的值设置为
true
。例如,假设您有三个代理链: BrokerA、BrokerB 和 BrokerC,带有生成者位于 BrokerA 和位于 BrokerC 的消费者。在这种情况下,您希望 BrokerB 重新联邦消费者到 BrokerA。
-
一个
4.22.4.2. 使用核心协议配置联邦 复制链接链接已复制到粘贴板!
您可以将消息和队列联邦配置为使用 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>
<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow name
- 联邦配置的名称。在本例中,名称对应于本地代理的名称。
user
- 用于与上游代理连接的共享用户名。
password
- 用于与上游代理连接的共享密码。
注意如果远程代理的用户和密码凭证不同,您可以在将代理添加到配置中时为这些代理单独指定凭证。此流程稍后将对此进行说明。
在
federation
元素中,添加一个 <address-policy>
元素。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 绑定被侦听。如果存在与地址策略包含地址匹配的地址的 divert 绑定,则与 divert 的转发地址匹配的队列绑定都将创建需求。默认值为false
。 max-hops
- 消息在联邦期间可以进行的最大跃点数。特定的拓扑需要此属性的特定值。要了解更多有关这些要求的信息,请参阅 第 4.22.2 节 “地址联邦的通用拓扑”。
transformer-ref
- 转换器配置的名称。如果要在联邦消息传输过程中转换消息,您可以添加转换器配置。此流程稍后会描述转换器配置。
在 <
;address-policy&
gt; 元素中,添加 address-matching 模式,以便从地址策略包含和排除地址。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Include
-
此元素的
address-match
属性的值指定要包含在地址策略中的地址。您可以指定一个准确的地址,如queue.bbc.new
或queue.usatoday
。或者,您可以使用通配符表达式来指定匹配的地址 集合。在前面的示例中,地址策略还包含以字符串queue.news
开头的所有 地址名称。 exclude
-
此元素的
address-match
属性的值指定要从地址策略中排除的地址。您可以指定一个准确的地址名称,或使用通配符表达式来指定匹配的地址 集合。在前面的示例中,地址策略排除以字符串queue.news.sport
开头的所有 地址名称。
(可选)在
federation
元素中,添加一个transformer
元素来引用自定义转换器实施。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow name
-
转换器配置的名称。此名称在本地代理中必须是唯一的。这是您指定为地址策略的
transformer-ref
属性的值的名称。 class-name
实施
org.apache.activemq.artemis.core.server.transformer.Transformer
接口的用户定义类的名称。在传输消息前,通过消息调用转换器的
transform ()
方法。这可让您在联邦前转换消息标头或正文。属性
- 用于保存特定转换器配置的键值对。
在
federation
元素内,添加一个或多个上游
元素。每个upstream
元素定义到远程代理的连接,以及要应用到该连接的策略。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow static-connectors
-
包含
connector-ref
元素列表,该元素引用本地代理的broker.xml
配置文件中定义的连接器
元素。连接器定义用于传出连接的传输(TCP、SSL、HTTP 等)和服务器连接参数(主机、端口等)。此流程的下一步演示了如何添加static-connectors
元素中引用的连接器。 policy-ref
- 在应用到上游代理的下游代理上配置的地址策略的名称。
您可以为
上游
元素指定的附加选项如下所述:name
-
上游代理配置的名称。在本例中,名称对应于名为
eu-east-1
和eu-west-1
的上游代理。 user
-
创建与上游代理的连接时使用的用户名。如果没有指定,则使用在
federation
元素配置中指定的共享用户名。 password
-
创建与上游代理的连接时使用的密码。如果没有指定,则使用
联邦
元素配置中指定的共享密码。 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 上游代理关闭时自动切换到备份代理。默认值为false
。 initial-connect-attempts
-
downstream 代理将连接到上游代理的初始尝试数。如果在没有建立连接的情况下达到这个值,则上游代理会被视为永久离线。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>
<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.22.4.2.3. 配置下游地址联邦 复制链接链接已复制到粘贴板!
以下示例演示了如何为独立代理配置下游地址联邦。
下游地址联邦允许您在一个或多个远程代理用来连接到本地代理的本地代理中添加配置。这种方法的优点是,您可以在单个代理中保留所有联邦配置。例如,这可能是 hub 和spoke 拓扑的一个有用的方法。
下游地址与上游地址配置与联邦连接的方向相反。因此,当您将远程代理添加到配置中时,这些代理会被视为 下游 代理。downstream 代理使用配置中的连接信息来连接本地代理,该代理现在被视为上游。这个示例稍后会说明这一点,当您为远程代理添加配置时。
先决条件
- 您应该熟悉上游地址联邦的配置。请参阅 第 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"> </federation> </federations>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加地址策略配置。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要在传输前转换消息,请添加转换器配置。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为每个远程代理添加
downstream
项。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如前面的配置所示,远程代理现在被视为本地代理的下游。downstream 代理使用配置中的连接信息来重新连接到本地(即 上游)代理。
在本地代理上,添加本地和远程代理使用的连接器和接收器来建立联邦连接。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow connector name="netty-connector"
- 本地代理发送到远程代理的连接器配置。远程代理使用此配置连接到本地代理。
connector name="eu-west-1-connector"
,connector name="eu-east-1-connector"
- 远程代理的连接器。本地代理使用这些连接器连接到远程代理,并共享远程代理需要连接到本地代理所需的配置。
acceptor name="netty-acceptor"
- 接受与远程代理使用的连接器对应的本地代理中的 acceptor,以连接到本地代理。
4.22.4.2.4. 关于队列联邦 复制链接链接已复制到粘贴板!
队列联邦提供了一种在不同远程代理间平衡单个队列的负载的方法。
为了实现负载平衡,本地代理会从远程队列检索消息,以满足来自本地消费者的消息的需求。下面是一个示例。
图 4.9. 对称队列联邦
远程队列不需要重新配置,它们不必位于同一代理或同一集群中。建立远程链接和联邦队列所需的所有配置都位于本地代理中。
4.22.4.2.4.1. 队列联邦的优点 复制链接链接已复制到粘贴板!
以下是您可能选择配置队列联邦的一些原因。
- 增加容量
- 队列联邦可以创建在多个代理上分发的"逻辑"队列。这个逻辑分布式队列的容量比单一代理中的单个队列高。在这个设置中,尽可能多的信息会从最初发布到的代理中消耗。只有在需要负载均衡时,系统才会在联邦中移动信息。
- 部署多区域设置
在多区域设置中,您可能在一个区域或场所和消费者中有一个消息制作者。但是,您最好将生成者和消费者连接保留给给定区域。在这种情况下,您可以在生成者和消费者的每个区域中部署代理,并使用队列联邦在区域间的广域网(WAN)上移动消息。下面是一个示例。
图 4.10. 多区域队列联邦
- 安全企业 LAN 和 DMZ 间的通信
在网络安全中,非大区 (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>
<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow name
- 联邦配置的名称。在本例中,名称对应于下游代理的名称。
user
- 用于与上游代理连接的共享用户名。
password
- 用于与上游代理连接的共享密码。
注意- 如果对上游代理的用户和密码凭证不同,您可以在将代理添加到配置中时为这些代理单独指定凭证。此流程稍后将对此进行说明。
在
federation
元素中添加 <queue-policy>
元素。为 <queue-policy&
gt; 元素的属性指定值。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow name
- 队列策略的名称。在代理上配置的所有队列策略必须具有唯一的名称。
include-federated
当此属性的值设为
false
时,配置不会重新联邦已经被联邦的消费者(即联邦队列中的消费者)。这可避免在对称或闭环拓扑中发生,没有非联邦的消费者,并且系统间没有消息流。如果您没有 闭环拓扑,您可以将此属性的值设置为
true
。例如,假设您有 3 个代理链:BrokerA
BrokerB
和BrokerC
,以及位于 BrokerA 的制作者,以及BrokerC
的消费者。在这种情况下,您将希望BrokerB
重新联邦消费者到BrokerA
。priority-adjustment
当消费者连接到队列时,在创建上游( 联邦)消费者时,会使用其优先级。联合消费者的优先级由
priority-adjustment
属性的值调整。此属性的默认值为-1
,这样可确保本地消费者在负载平衡期间优先于联合消费者。但是,您可以根据需要更改优先级调整的值。如果优先级调整不足,以防止太多信息迁移到联邦用户,这可能会导致消息在代理间返回或出现,您可以限制移到联邦消费者的消息大小。要限制批处理大小,请在联邦消费者的连接 URI 上将
consumerWindowSize
值设置为0。
tcp://<host>:<port>?consumerWindowSize=0
tcp://<host>:<port>?consumerWindowSize=0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
consumerWindowSize
值设置为0
时,AMQ Broker 使用地址设置中的defaultConsumerWindowSize
参数的值用于匹配地址,以确定可在代理之间移动的消息的批处理大小。defaultConsumerWindowSize
属性的默认值为1048576
字节。transformer-ref
- 转换器配置的名称。如果要在联邦消息传输过程中转换消息,您可以添加转换器配置。此流程稍后会描述转换器配置。
在 <
;queue-policy
> 元素中,添加地址匹配模式,以便从队列策略包含和排除地址。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Include
此元素的
address-match
属性的值指定要包含在队列策略中的地址。您可以指定一个准确的地址,如queue.bbc.new
或queue.usatoday
。或者,您可以使用通配符表达式来指定匹配的地址 集合。在前面的示例中,队列策略还包含以字符串queue.news
开头的所有 地址名称。与
address-match
属性相结合,您可以使用queue-match
属性在队列策略中包含这些地址的特定队列。与address-match
属性一样,您可以指定一个准确的队列名称,也可以使用通配符表达式来指定 一组 队列。在前面的示例中,数字符号 (#
) 通配符代表在每个地址或包括在队列策略中的一组地址中的所有队列。exclude
-
此元素的
address-match
属性的值指定要从队列策略中排除的地址。您可以指定一个准确的地址,或使用通配符表达式来指定匹配的地址 集合。在前面的示例中,数字符号(#
)通配符表示排除任何匹配跨越 所有地址中的queue-match
属性的队列。在这种情况下,所有以字符串.local
结尾的队列都会被排除。这表示某些队列被保留为本地队列,而不是联邦。
在
federation
元素中,添加一个转换器
元素来引用自定义转换器实施。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow name
-
转换器配置的名称。在相关的代理中,这个名称必须是唯一的。您可以将此名称指定为地址策略的
transformer-ref
属性的值。 class-name
实施
org.apache.activemq.artemis.core.server.transformer.Transformer
接口的用户定义类的名称。在传输消息前,通过消息调用转换器的
transform ()
方法。这可让您在联邦前转换消息标头或正文。属性
- 用于保存特定转换器配置的键值对。
在
federation
元素内,添加一个或多个上游
元素。每个upstream
元素定义上游代理连接以及要应用到该连接的策略。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow static-connectors
-
包含
connector-ref
元素列表,该元素引用本地代理的broker.xml
配置文件中定义的连接器
元素。连接器定义用于传出连接的传输(TCP、SSL、HTTP 等)和服务器连接参数(主机、端口等)。以下流程的以下步骤演示了如何添加联邦队列配置的static-connectors
元素引用的连接器。 policy-ref
- 在应用到上游代理的下游代理上配置的队列策略的名称。
您可以为
上游
元素指定的附加选项如下所述:name
-
上游代理配置的名称。在本例中,名称对应于名为
eu-east-1
和eu-west-1
的上游代理。 user
-
创建与上游代理的连接时使用的用户名。如果没有指定,则使用在
federation
元素配置中指定的共享用户名。 password
-
创建与上游代理的连接时使用的密码。如果没有指定,则使用
联邦
元素配置中指定的共享密码。 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 上游代理关闭时自动切换到备份代理。默认值为false
。 initial-connect-attempts
-
downstream 代理将连接到上游代理的初始尝试数。如果在没有建立连接的情况下达到这个值,则上游代理会被视为永久离线。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>
<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您希望大型消息在联邦连接之间流,在用于联邦连接的连接器中将
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>
<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>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关大型信息的详情,请参考 第 8 章 处理大型消息。
4.22.4.2.6. 配置下游队列联邦 复制链接链接已复制到粘贴板!
以下示例演示了如何配置下游队列联邦。
下游队列联邦允许您在一个或多个远程代理用来连接到本地代理的本地代理中添加配置。这种方法的优点是,您可以在单个代理中保留所有联邦配置。例如,这可能是 hub 和spoke 拓扑的一个有用的方法。
下游队列联邦将联邦连接的方向与上游队列配置相反。因此,当您将远程代理添加到配置中时,这些代理会被视为 下游 代理。downstream 代理使用配置中的连接信息来连接本地代理,该代理现在被视为上游。这个示例稍后会说明这一点,当您为远程代理添加配置时。
先决条件
- 您应该熟悉上游队列联邦的配置。请参阅 第 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"> </federation> </federations>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加队列策略配置。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要在传输前转换消息,请添加转换器配置。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为每个远程代理添加
downstream
项。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如前面的配置所示,远程代理现在被视为本地代理的下游。downstream 代理使用配置中的连接信息来重新连接到本地(即 上游)代理。
在本地代理上,添加本地和远程代理使用的连接器和接收器来建立联邦连接。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow connector name="netty-connector"
- 本地代理发送到远程代理的连接器配置。远程代理使用此配置连接到本地代理。
connector name="eu-west-1-connector"
,connector name="eu-east-1-connector"
- 远程代理的连接器。本地代理使用这些连接器连接到远程代理,并共享远程代理需要连接到本地代理所需的配置。
acceptor name="netty-acceptor"
接受与远程代理使用的连接器对应的本地代理中的 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>
<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>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关大型信息的详情,请参考 第 8 章 处理大型消息。