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 |
跟踪消息缓存的大小(以字节为单位)。仅当 trackMessages 为 true 时适用。 |
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 开始:如果代理在本地和远程网络中都可用,可以使用 priorityBackup
和 priorityURIs
选项指定对本地代理的偏好而不是对远程代理的偏好。
考虑以下 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
在这种情况下,客户端将优先考虑 local1
或 local2
代理,并在它们可用时(重新)连接到它们。
配置嵌套 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 选项以及嵌套选项,则嵌套选项定义将优先。