故障转移传输层重新连接任何其他传输器之上的逻辑。配置语法允许您指定任意数量的复合URI。故障转移传输随机选择一个复合URI,并尝试建立与之的连接。如果它不成功,或者如果随后失败,则从列表中随机选择一个其他URI,建立一个新的连接。
配置语法
failover:(uri1,...,uriN)?transportOptions&nestedURIOptions
要么
failover:uri1,...,uriN
例:
failover:(tcp:// localhost:61616,tcp:// remotehost:61616)?initialReconnectDelay = 100
运输选项
| 选项名称 |
默认值 |
描述 |
|---|---|---|
| |
|
初始化并保持第二个传输连接 - 启用快速故障转移。 |
| |
|
在第一次重新连接尝试之前的延迟(以ms为单位)。 |
| |
|
跟踪消息缓存的大小(字节)。 适用前提 |
| |
|
从ActiveMQ 5.6:默认是 |
| |
|
第二次和随后的重新连接尝试之间的最大延迟(以毫秒为单位)。 |
| |
|
从ActiveMQ 5.9:将应用于列表中每个URI的常用URI选项。 |
| |
|
如果 |
| |
|
在指数退避尝试期间使用的指数。 |
| |
|
确定客户端是否应该使用重新连接来响应代理 |
| |
|
值 值 注意:一旦成功连接,该 |
| |
|
从ActiveMQ 5.3:设置发送操作的超时(以毫秒为单位),而不会中断重连接进程。 |
| |
|
保留在重新连接时刷新到代理的快速消息。 |
| |
|
从ActiveMQ 5.4:确定客户端是否应该接受从代理到其已知URI列表的更新。 |
| |
|
从ActiveMQ 5.4:到文本文件的URL(或本地文件的路径),该文本文件包含在出现故障时用于重新连接的逗号分隔的URI列表。 |
| |
|
如果 |
| |
|
从ActiveMQ 5.10:一个值 |
使用随机化
默认情况下,故障切换传输随机选择一个URI。这有效地平衡了多个经纪人的客户端。但是,要使客户端连接到主服务器,并且仅在主服务器不可用时才连接到辅助备用代理程序randomize=false。
例:
failover:(tcp:// primary:61616,tcp:// secondary:61616)?randomize = false
笔记
在故障转移传输发送操作下,默认情况下,当代理变得不可用时,将无限期地阻止。有两个可用于处理此方案的选项。首先,无论是设置一个TransportListener上直接ActiveMQConnectionFactory,使其处于适当位置,可能需要一个网络跳或第二,设置任何请求之前timeout选择。该timeout选项使当前发送操作在指定的超时后失败。
例:
故障转移:(tcp:// primary:61616)?timeout = 3000
在此示例中,如果连接未建立,则发送操作将在3秒后超时。重要的是要注意,当超时发生时连接不会被杀死。因此,有可能在经纪人变得可用后再次使用相同的连接重新发送受影响的消息。
交易
默认情况下,故障转移传输跟踪事务。重新连接时重播飞行中的交易。对于简单的情况,这可以按预期方式工作。然而,关于确认(或消费者)交易存在一种假设,因为先前接收到的消息将在重新连接时自动重播。然而,当有许多连接和消费者时,这并不总是正确的,因为重新发送订单不能保证,因为陈旧的确认可能会干扰新传递的消息。这可能导致未确认的消息。
从ActiveMQ 5.3.1:跟踪重新发送顺序,如果在故障切换后未重新传递未完成的消息,则事务将无法提交。javax.jms.TransactionRolledBackException如果提交失败,则抛出A。有疑问的交易将导致回滚,以便可以由应用程序重播。当提交消息在飞行中时,发生故障转移时,会发生疑难事务。不可能知道确切的故障点。发生故障是因为事务提交消息未传递或提交回复丢失?在任一情况下,有必要回滚事务,以便应用程序可以获得失败的指示并处理任何潜在的问题。
用于故障切换的代理端选项
从ActiveMQ 5.4: TransportConnector有可用的选项,以便代理可以自动更新客户机,以了解有关可用(或不再可用)故障转移的新代理商的存在的信息。
选项是:
| 选项名称 |
默认值 |
描述 |
|---|---|---|
| |
|
如果 |
| |
|
如果 |
| |
|
如果 |
| |
|
逗号分隔的正则表达式过滤器列表,用于匹配经纪人的代理名称,以指定为客户端的故障转移群集的一部分。 |
例:
<
broker
>
...
<
transportConnectors
>
<
transportConnector
name
=
"openwire"
uri
=
"tcp://0.0.0.0:61616"
updateClusterClients
=
"true"
updateClusterFilter
=
".*A.*,.*B.*"
/>
</<
transportConnectors
>
...
</
broker
>
|
当updateClusterClients=true客户端只需要配置集群中的一个代理的详细信息才能连接。
例:
故障转移:(tcp:// primary:61616)
当新经纪人加入群集时,客户端将被自动通知新代理的URI。当其他已知代理商之一变得不可用时,新的URI可用于故障转移。
附加信息
优先备份
从ActiveMQ 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 5.9:通用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