ActiveMQ的断线重连机制

断线重连机制是ActiveMQ的高可用性具体体现之一。ActiveMQ提供failover机制去实现断线重连的高可用性,可以使得连接断开之后,不断的重试连接到一个或多个brokerURL。

默认情况下,如果client与broker直接的connection断开,则client会新起一个线程,不断的从url参数中获取一个url来重试连接。

配置语法

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


例如:

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

具体配置参数参考:http://activemq.apache.org/failover-transport-reference.html

使用randomize
默认情况下,failover机制从URI列表中随机选择出一个URI进行连接,这可以有效地控制客户端在多个broker上的负载均衡,但是,要使客户端首先连接到主节点,并在主节点不可用时只连接到辅助备份代理,需要设置randomize = false。

failover:(tcp://master:61616,tcp://slave:61616)?randomize=false

在failover机制下传输,发送操作将默认在broker变得不可用时无限期阻塞。 有两个选项可用于处理此方案。 首先,直接在ActiveMQConnectionFactory上设置一个TransportListener,以便在任何可能需要网络跳跃的请求之前就位,或者设置超时选项。 超时选项会导致当前发送操作在指定的超时后失败。

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

在此示例中,如果连接未建立,发送操作将在3秒后超时。 需要注意的是,当超时发生时连接不会被终止。 因此,一旦broker可用,以后可能使用相同的连接重新发送受影响的消息。

broker端的配置参数

例子:

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

当updateClusterClients=”true”时,client端的failover配置只需要写成:

failover:(tcp://primary:61616)

当新的broker加入集群时,客户端被自动通知新的broker的URI。 当其他已知broker之一不可用时,新的URI可用于故障转移。

Priority Backup
ActiveMQ 5.6+开始,如果broker在本地和远程网络中都可用,则可以使用priorityBackup和priorityURIs选项为远程broker指定本地broker的首选项。

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

以上配置例子,客户端将尝试连接并保持连接到本地broker。 如果本地broker失败,它当然会故障转移到远程。 但是,由于使用priorityBackup参数,客户端将不断尝试重新连接到本地。 一旦客户端可以这样做,客户端将重新连接到它,而不需要任何手动干预。

默认情况下,只有列表中的第一个URI被视为优先级(本地)。 在大多数情况下,这就足够了。 然而,在一些情况下,可能需要具有多个“本地”URI。 priorityURIs选项可用于指定哪些URI被视为优先级。

failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616
---------------------
作者:ProHayley
来源:CSDN
原文:https://blog.csdn.net/zuolj/article/details/53167758
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/jay-wu/p/9988003.html