Failover 传输参考

使用 ActiveMQ Classic > 配置传输 > ActiveMQ Classic 连接 URI > Failover 传输参考

Failover 传输

Failover 传输在任何其他传输之上添加重新连接逻辑。配置语法允许您指定任意数量的复合 URI。Failover 传输随机选择一个复合 URI 并尝试与其建立连接。如果失败或随后失败,则会建立一个新连接,随机选择列表中的其他 URI 之一。

配置语法

failover:(uri1,...,uriN)?transportOptions&nestedURIOptions

failover:uri1,...,uriN

示例

failover:(tcp://127.0.0.1:61616,tcp://remotehost:61616)?initialReconnectDelay=100

传输选项

选项名称 默认值 描述
backup false 初始化并保持第二个传输连接 - 以启用快速故障转移。
initialReconnectDelay 10 首次重新连接尝试之前的延迟(以毫秒为单位)。
maxCacheSize 131072 跟踪消息缓存的大小(以字节为单位)。仅当 trackMessagestrue 时适用。
maxReconnectAttempts -1 | 0 从 ActiveMQ Classic 5.6 开始:默认值为 -1,无限次重试。 0 表示禁用重新连接,例如:只尝试连接一次。在 ActiveMQ Classic 5.6 之前:默认值为 0,无限次重试。所有 ActiveMQ Classic 版本:值 >0 表示在将错误发送回客户端之前最大重新连接尝试次数。
maxReconnectDelay 30000 第二次及后续重新连接尝试之间的最大延迟(以毫秒为单位)。
nested.* null 从 ActiveMQ Classic 5.9 开始:将应用于列表中每个 URI 的通用 URI 选项
randomize true 如果 true,则从列表中随机选择一个 URI 用于重新连接。
reconnectDelayExponent 2.0 指数回退尝试期间使用的指数。
reconnectSupported true 确定客户端是否应该响应代理 ConnectionControl 事件并重新连接(请参阅:rebalanceClusterClients)。
startupMaxReconnectAttempts -1 值为 -1 表示启动时连接尝试次数应无限次。值为  >=0 表示启动时将进行的重新连接尝试次数,在此之后,当客户端进行后续重新连接尝试时,将向客户端发送错误。注意:成功连接后,maxReconnectAttempts 选项优先。
timeout -1 从 ActiveMQ Classic 5.3 开始:设置发送操作的超时时间(以毫秒为单位),不会中断重新连接过程。
trackMessages false 保留正在飞行的消息的缓存,这些消息将在重新连接时刷新到代理。
updateURIsSupported true ActiveMQ Classic 5.4 开始:确定客户端是否应接受代理对其已知 URI 列表的更新。
updateURIsURL null 从 ActiveMQ Classic 5.4 开始:URL(或本地文件的路径)指向包含逗号分隔的 URI 列表的文本文件,该列表在发生故障时用于重新连接。
useExponentialBackOff true 如果 true,则在重新连接尝试之间使用指数回退。
warnAfterReconnectAttempts 10 从 ActiveMQ Classic 5.10 开始:值为 >0 指定在记录警告之前重新连接尝试的次数。记录的警告表明当前没有连接,但正在尝试重新连接。值为 <=0 禁用有关重新连接尝试的警告日志记录。

使用随机化

Failover 传输默认情况下会随机选择一个 URI。这有效地将客户端负载平衡到多个代理。但是,要让客户端首先连接到主服务器,并且仅当主服务器不可用时才连接到辅助备份代理,请设置 randomize=false

示例

failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false
注意

在 Failover 传输下,发送操作默认情况下会在代理不可用时无限期阻塞。有两种选项可用于处理这种情况。首先,要么直接在 TransportListener 上设置 ActiveMQConnectionFactory,以便在可能需要网络跳转或第二步的任何请求之前都处于就绪状态,要么设置 timeout 选项。 timeout 选项会导致当前发送操作在指定超时时间后失败。

示例

failover:(tcp://primary:61616)?timeout=3000

在本例中,如果连接未建立,则发送操作将在 3 秒后超时。需要注意的是,连接不会在超时时被杀死。因此,可以在代理可用后使用相同连接稍后重新发送受影响的消息。

事务

Failover 传输默认情况下会跟踪事务。正在飞行的交易将在重新连接后重新播放。对于简单的情况,这按预期工作。但是,关于已确认(或消费者)事务存在一个假设,即先前接收的消息将在重新连接后自动重新播放。然而,当存在许多连接和消费者时,情况并非总是如此,因为重新传递顺序没有保证,因为陈旧的未决确认可能会干扰新传递的消息。这会导致未确认的消息。

从 ActiveMQ Classic 5.3.1 开始:重新传递顺序跟踪的,如果未决消息在故障转移后未重新传递,则事务将无法提交。如果提交失败,将抛出 javax.jms.TransactionRolledBackException。有疑问的事务会导致回滚,以便应用程序可以重新播放它们。当故障转移发生在提交消息正在飞行的过程中时,就会发生有疑问的事务。无法知道确切的失败点。失败是因为未传递事务提交消息还是提交回复丢失?无论哪种情况,都需要回滚事务,以便应用程序可以获得故障的指示并处理任何潜在的问题。

代理侧的故障转移选项

从 ActiveMQ Classic 5.4 开始TransportConnector 提供了可用的选项,以便代理可以自动向客户端更新有关可用新代理(或不再可用于故障转移的代理)的信息。

这些选项是

选项名称 默认值 描述
updateClusterClients false 如果 true,则将有关代理集群拓扑变化的信息传递给已连接的客户端。
rebalanceClusterClients false 如果 true,则在新的代理加入代理网络时,会要求已连接的客户端在代理集群中重新平衡(注意: priorityBackup=true 可以覆盖)。
updateClusterClientsOnRemove false 如果 true,则会在集群从网络中移除时更新客户端。将此选项作为单独的选项,使客户端可以在新的代理加入时更新,但不会在代理离开时更新。
updateClusterFilter null 用于匹配代理名称的正则表达式过滤器列表,用于指定作为客户端故障转移集群一部分的代理。

示例

<broker>
  ...
  <transportConnectors>
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" updateClusterFilter=".\*A.\*,.\*B.\*"/>
  </<transportConnectors>
  ...
</broker>

updateClusterClients=true 时,客户端只需要配置集群中一个代理的详细信息即可连接。

示例

failover:(tcp://primary:61616)

当新的代理加入集群时,客户端会自动收到有关新代理 URI 的通知。然后,当其中一个已知代理不可用时,新 URI 可用于故障转移。

其他信息

请参阅以下关于使用集群客户端更新和重新平衡功能的博客文章,标题为 ActiveMQ Classic 5.4 中的新功能:自动集群更新和重新平衡

优先备份

从 ActiveMQ Classic 5.6 开始:如果代理在本地和远程网络中都可用,可以使用 priorityBackuppriorityURIs 选项指定对本地代理的偏好而不是对远程代理的偏好。

考虑以下 URL

failover:(tcp://local:61616,tcp://remote:61616)?randomize=false&priorityBackup=true

给定此 URL,客户端将尝试连接并保持连接到 local 代理。如果 local 代理失败,它当然会故障转移到 remote。但是,由于使用了 priorityBackup 参数,客户端将不断尝试重新连接到 local。一旦客户端能够这样做,客户端将重新连接到它,无需任何手动干预。

默认情况下,只考虑列表中的第一个 URI 作为优先级(local)。在大多数情况下,这已经足够了。但是,在某些情况下,可能需要多个“本地”URI。 priorityURIs 选项可用于指定哪些 URI 被认为是优先级。

示例

failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616

在这种情况下,客户端将优先考虑 local1local2 代理,并在它们可用时(重新)连接到它们。

配置嵌套 URI 选项。

从 ActiveMQ Classic 5.9 开始:可以通过将通用 URI 选项追加到 failover URI 的查询字符串来配置通用 URI 选项,其中每个通用 URI 选项都有前缀: nested. 

示例 - 代替这样做

failover:(tcp://broker1:61616?wireFormat.maxInactivityDuration=1000,tcp://broker2:61616?wireFormat.maxInactivityDuration=1000,tcp://broker3:61616?wireFormat.maxInactivityDuration=1000) 

这样做

failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)?nested.wireFormat.maxInactivityDuration=1000

任何可以应用于单个 URI 的查询字符串的选项都可以作为 nested 选项使用。

选项优先级

如果将同一个选项指定为单个 URI 选项以及嵌套选项,则嵌套选项定义将优先。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 获得许可。