Apache ActiveMQ Artemis 客户端可以配置为在检测到客户端和服务器之间的连接出现故障时,自动重新连接到同一服务器、重新连接到备份服务器或重新连接到其他活动服务器。当客户端在 检测到死连接 部分中说明的 client-failure-check-period
指定的时间内未从服务器收到任何数据包时,客户端会检测到连接故障。
1. 重新连接到同一服务器
将 reconnectAttempts
设置为任何非零值以重新连接到同一服务器,有关更多详细信息,请参阅重新连接和故障转移属性。
如果断开连接是由于某些瞬态故障导致的,例如临时网络中断,并且目标服务器未重启,则会话仍将存在于服务器上,假设客户端未断开连接超过connection-ttl
在这种情况下,客户端会话将在重新连接后自动重新连接到服务器会话。此过程完全透明,客户端可以继续执行,就像什么也没发生一样。
其工作原理如下
当 Apache ActiveMQ Artemis 客户端向其服务器发送命令时,它们会将每个已发送的命令存储在内存缓冲区中。如果发生连接故障,并且客户端随后重新连接到同一服务器,则作为重新连接协议的一部分,服务器会在重新连接期间通知客户端它成功接收到的来自该客户端的最后一个命令的 ID。
如果客户端发送的命令数量超过故障转移前接收到的命令数量,则它可以重播其缓冲区中的任何已发送命令,以便客户端和服务器可以协调其状态。Ac
此缓冲区的大小由连接 URL 上的 confirmationWindowSize
参数配置。当服务器收到 confirmationWindowSize
字节的命令并对其进行处理后,它将向客户端发送命令确认,然后客户端可以释放缓冲区中的空间。
窗口以字节为单位指定。
将此参数设置为 -1
将禁用任何缓冲,并阻止任何重新连接,强制重新连接而不是重新连接。此参数的默认值为 -1
。(这意味着默认情况下不会发生自动重新连接)
2. 重新连接到备份服务器
将 reconnectAttempts
设置为任何非零值并将 ha
设置为 true
以重新连接到后端服务器,有关更多详细信息,请参阅重新连接和故障转移属性。
客户端可以配置为通过多种不同的方式发现活动备份服务器组列表。它们可以被显式配置,或者最常见的方式是使用服务器发现让客户端自动发现列表。有关如何配置服务器发现的完整详细信息,请参阅集群。或者,客户端可以显式连接到特定服务器并下载当前服务器和备份,请参阅集群。
默认情况下,故障转移仅在至少建立一个连接后才会发生。换句话说,默认情况下,如果客户端无法建立初始连接,则不会发生故障转移 - 在这种情况下,它只会根据 reconnect-attempts 属性尝试重新连接,并在尝试次数达到此次数后失败。
3. 重新连接到其他活动服务器
将 failoverAttempts
设置为任何非零值以重新连接到其他活动服务器,有关更多详细信息,请参阅重新连接和故障转移属性。
如果 reconnectAttempts
值不为零,则客户端将仅在所有尝试重新连接到同一服务器或重新连接到备份服务器失败后才尝试重新连接到其他活动服务器。
4. 会话重新连接
当客户端在服务器重启后重新连接到同一服务器、重新连接到备份服务器或重新连接到其他活动服务器时,任何会话将不再存在于服务器上,并且无法完全透明地重新连接到它们。在这种情况下,客户端上的任何会话和消费者都将在服务器上自动重新创建。
客户端重新连接还用于内部组件,例如核心网桥,以允许它们重新连接到其目标服务器。
5. 初始连接时的故障转移
由于客户端只有在建立第一个连接后才能了解完整的拓扑,因此存在一个窗口,在此窗口中它不知道备份。如果此时发生故障,客户端只能尝试重新连接到原始服务器。要配置客户端将进行多少次尝试,可以设置 URL 参数 initialConnectAttempts
。其默认值为 0
,即只尝试一次。完成尝试次数后,将抛出异常。
有关使用事务性和非事务性 JMS 会话进行自动故障转移的示例,请参阅示例一章。
6. 重新连接和故障转移属性
使用以下参数配置客户端重新连接和故障转移
- retryInterval
-
此可选参数确定如果连接到目标服务器失败,后续重新连接尝试之间的间隔时间(以毫秒为单位)。默认值为
2000
毫秒。 - retryIntervalMultiplier
-
此可选参数确定要应用于自上次重试以来的时间的乘数,以计算下一次重试的时间。
这使您可以实现重试尝试之间的指数退避。
让我们举个例子
如果我们将
retryInterval
设置为1000
毫秒,并将retryIntervalMultiplier
设置为2.0
,那么,如果第一次重新连接尝试失败,我们将等待1000
毫秒,然后2000
毫秒,然后4000
毫秒,以便进行后续的重新连接尝试。默认值为
1.0
,这意味着每次重新连接尝试都以相等的时间间隔进行。 - maxRetryInterval
-
此可选参数确定将使用的最大重试间隔。在设置
retryIntervalMultiplier
时,否则可能会导致后续重试以指数方式增加到非常大的值。通过设置此参数,您可以对该值设置上限。默认值为2000
毫秒。 - ha
-
此可选参数确定当主节点不可达时,客户端是否将尝试重新连接到备份节点。默认值为
false
。有关 HA 的更多信息,请参阅高可用性和故障转移。 - reconnectAttempts
-
此可选参数确定在放弃之前,对当前活动/备份对进行的重新连接尝试的总数。值为
-1
表示无限次尝试。默认值为0
。 - failoverAttempts
-
此可选参数确定在重新连接失败后,在放弃并关闭之前进行的故障转移尝试的总数。值为
-1
表示无限次尝试。默认值为0
。
所有这些参数都设置在用于连接到代理的 URL 上。
如果您的客户端确实设法重新连接,但会话不再在服务器上可用,例如如果服务器已重启或已超时,则客户端将无法重新连接,并且将调用在连接或会话上注册的任何 ExceptionListener
或 FailureListener
实例。
7. ExceptionListeners 和 SessionFailureListeners
请注意,当客户端重新连接或重新连接时,将调用任何注册的 JMS ExceptionListener
或核心 API SessionFailureListener
。