桥接的作用是从源队列接收消息,并将其转发到目标地址,通常是在不同的 Apache ActiveMQ Artemis 服务器上。

源服务器和目标服务器不必位于同一集群中,这使得桥接适合于可靠地将消息从一个集群发送到另一个集群,例如跨 WAN 或互联网,以及连接可能不可靠的情况。

桥接内置了故障恢复机制,因此如果目标服务器连接丢失,例如由于网络故障,桥接将尝试重新连接到目标服务器,直到它重新上线。当它重新上线时,它将恢复正常运行。

总之,桥接是可靠地连接两个独立的 Apache ActiveMQ Artemis 服务器的方法。使用核心桥接,源服务器和目标服务器都必须是 Apache ActiveMQ Artemis 服务器。

可以配置桥接以提供一次且仅一次的传递保证,即使在源服务器或目标服务器出现故障的情况下也是如此。它们通过使用重复检测来做到这一点(在重复检测中描述)。

虽然它们具有相似的功能,但不要将核心桥接与 JMS 桥接混淆!

核心桥接用于将一个 Apache ActiveMQ Artemis 节点与另一个 Apache ActiveMQ Artemis 节点连接,并且不使用 JMS API。JMS 桥接用于连接任何两个符合 JMS 1.1 标准的 JMS 提供程序。因此,JMS 桥接可用于与不同的符合 JMS 标准的消息系统进行桥接。如果可以,最好使用核心桥接。核心桥接使用重复检测来提供一次且仅一次的保证。要使用 JMS 桥接提供相同的保证,您需要使用 XA,XA 具有更高的开销,配置也更复杂。

1. 配置核心桥接

桥接在 broker.xml 中配置。让我们从一个例子开始

<bridge name="my-bridge">
   <queue-name>sausage-factory</queue-name>
   <forwarding-address>mincing-machine</forwarding-address>
   <ha>true</ha>
   <filter string="name='aardvark'"/>
   <transformer-class-name>
      org.apache.activemq.artemis.jms.example.HatColourChangeTransformer
   </transformer-class-name>
   <min-large-message-size>102400</min-large-message-size>
   <check-period>30000</check-period>
   <connection-ttl>60000</connection-ttl>
   <retry-interval>2000</retry-interval>
   <retry-interval-multiplier>1.0</retry-interval-multiplier>
   <max-retry-interval>2000</max-retry-interval>
   <initial-connect-attempts>-1</initial-connect-attempts>
   <reconnect-attempts>-1</reconnect-attempts>
   <use-duplicate-detection>true</use-duplicate-detection>
   <confirmation-window-size>10000000</confirmation-window-size>
   <producer-window-size>1048576</producer-window-size>
   <user>foouser</user>
   <password>foopassword</password>
   <reconnect-attempts-same-node>10</reconnect-attempts-same-node>
   <routing-type>PASS</routing-type>
   <concurrency>1</concurrency>
   <static-connectors>
      <connector-ref>remote-connector</connector-ref>
   </static-connectors>
   <!-- alternative to static-connectors
   <discovery-group-ref discovery-group-name="bridge-discovery-group"/>
   -->
   <client-id>myClientID</client-id>
</bridge>

在上面的例子中,我们展示了为桥接可以配置的所有参数。在实践中,您可能会使用许多默认值,因此不必显式地指定所有值。

让我们依次查看所有参数

name

所有桥接在服务器中都必须具有唯一的名称。

queue-name

这是桥接从中消费的本地队列的唯一名称,它是一个必填参数。

队列必须在启动时桥接实例化之前就已存在。

forwarding-address

这是目标服务器上消息将被转发到的地址。如果没有指定转发地址,则将保留消息的原始地址。

ha

此可选参数决定此桥接是否应支持高可用性。True 表示它将连接到集群中任何可用的服务器并支持故障转移。默认值为 false

filter-string

可以提供一个可选的过滤字符串。如果指定,则只有与过滤字符串中指定的过滤表达式匹配的消息才会被转发。过滤字符串遵循 ActiveMQ Artemis 过滤表达式语法,如过滤表达式中所述。

transformer-class-name

可以指定一个可选的转换器。这使您有机会在转发消息之前转换消息的标头或主体。有关转换器特定配置的更多详细信息,请参见转换器章节

min-large-message-size

任何大于此大小(以字节为单位)的消息都被视为大消息(以块发送)。支持字节表示法,例如 "K"、"MB"、"MiB"、"GB" 等。默认值为 102400(即 100KiB)。

check-period

设置用于检查桥接客户端是否未能从服务器接收 ping 的周期(以毫秒为单位)。使用 -1 禁用此检查。默认值为 30000

connection-ttl

在没有任何数据从桥接到达的情况下,远程服务器将保持连接存活的时间(以毫秒为单位)。这应该大于 check-period。默认值为 60000

retry-interval

此可选参数决定如果与目标服务器的连接失败,后续重新连接尝试之间的周期(以毫秒为单位)。默认值为 2000 毫秒。

retry-interval-multiplier

此可选参数确定一个乘数,用于将自上次重试以来的时间乘以该乘数以计算下一次重试的时间。

这使您能够在重试尝试之间实现指数退避

让我们举个例子

如果我们将 retry-interval 设置为 1000 ms,并将 retry-interval-multiplier 设置为 2.0,那么,如果第一次重新连接尝试失败,我们将等待 1000 ms,然后 2000 ms,然后 4000 ms 进行后续的重新连接尝试。

默认值为 1.0,这意味着每次重新连接尝试都间隔相等的时间。

max-retry-interval

这强制对 retry-interval 进行限制,因为它可能会由于 retry-interval-multiplier 而增长。默认值为 2000

initial-connect-attempts

此可选参数确定桥接在放弃并关闭之前将进行的初始连接尝试的总数。值为 -1 表示无限次尝试。默认值为 -1

reconnect-attempts

此可选参数确定桥接在放弃并关闭之前将进行的重新连接尝试的总数。值为 -1 表示无限次尝试。默认值为 -1

use-duplicate-detection

此可选参数确定桥接是否会自动将重复 ID 属性插入到它转发的每条消息中。

这样做,允许目标服务器对从源服务器收到的消息执行重复检测。如果连接失败或服务器崩溃,那么,当桥接恢复时,它将重新发送未确认的消息。这可能会导致重复的消息被发送到目标服务器。通过启用重复检测,可以筛选掉并忽略这些重复项。

这使桥接能够提供一次且仅一次的传递保证,而无需使用 XA 等重量级方法(有关更多信息,请参见重复检测)。

此参数的默认值为 true

confirmation-window-size

此可选参数确定用于将消息转发到目标节点的连接所使用的 confirmation-window-size。支持字节表示法,例如 "K"、"MB"、"MiB"、"GB" 等。此属性在客户端故障转移属性部分中描述。

当使用桥接将消息转发到使用来自具有设置的 max-size-bytes 的队列的 BLOCK address-full-policy 的地址时,重要的是 confirmation-window-size 小于或等于 max-size-bytes,以防止消息流停止。

producer-window-size

此可选参数确定通过桥接的生产者流量控制。使用 -1 禁用。支持字节表示法,例如 "K"、"MB"、"MiB"、"GB" 等。默认值为 1048576(即 1MiB)。

user

此可选参数确定在创建桥接连接到远程服务器时使用的用户名。如果未指定,则将使用 broker.xmlcluster-user 指定的默认集群用户。

password

此可选参数确定在创建桥接连接到远程服务器时使用的密码。如果未指定,则将使用 broker.xmlcluster-password 指定的默认集群密码。

reconnect-attempts-same-node

这配置了在恢复到初始连接器之前,将在拓扑上的同一个节点上进行重新连接尝试的次数。默认值为 10

routing-type

桥接可以对它转发的消息应用特定的路由类型,剥离现有的路由类型,或者只是将现有的路由类型传递过去。这在消息可能已设置其路由类型但您希望将其桥接到使用不同路由类型的地址的情况中很有用。重要的是要记住,具有 anycast 路由类型的消息实际上不会路由到使用 multicast 的队列,反之亦然。通过配置桥接的 routing-type,您有灵活性来处理任何情况。有效值为 ANYCASTMULTICASTPASSSTRIP。默认值为 PASS

concurrency

对于桥接高延迟网络,特别是对于具有高吞吐量的目标,可能必须为桥接提交更多工作线程。这是通过 concurrency 参数完成的。增加并发性将反映在桥接目标上出现的更多消费者和生产者,从而允许跨高延迟网络提高并行度。默认值为 1

当使用大于 1 的 concurrency 值时,将创建多个桥接并使用索引命名。例如,如果名为 myBridge 的桥接配置了 concurrency3,那么实际上将创建 3 个桥接,分别命名为 myBridge-0myBridge-1myBridge-2。对于管理操作来说,这一点很重要,因为每个桥接都将有其自己的关联的 BridgeControl

static-connectors

选择此选项或 discovery-group-ref 将桥接连接到目标服务器。

static-connectors 是指向在其他地方定义的 connector 元素的 connector-ref 元素列表。连接器封装了关于使用什么传输(TCP、SSL、HTTP 等)以及服务器连接参数(主机、端口等)的知识。有关连接器是什么以及如何配置它们的更多信息,请参见配置传输

discovery-group-ref

选择此选项或 static-connector 将桥接连接到目标服务器。

discovery-group-ref 元素有一个属性 - discovery-group-name。此属性指向在其他地方定义的 discovery-group。有关发现组是什么以及如何配置它们的更多信息,请参见发现组

client-id

用于桥接连接的可选标识符。这有助于在远程代理上识别连接(例如,通过 Web 控制台)。默认情况下为空(即未设置)。