Apache ActiveMQ Artemis 用戶端可以設定為在用戶端與伺服器之間的連線偵測到失敗時,自動重新連線到同一伺服器、重新連線到備份伺服器或重新連線到其他活動伺服器。當用戶端在 client-failure-check-period
指定的時間內未收到來自伺服器的任何封包時,就會偵測到連線失敗,如偵測死連線章節所述。
1. 重新連線到同一伺服器
將 reconnectAttempts
設定為任何非零值,以重新連線到同一伺服器,詳細資訊請參閱重新連線和容錯移轉屬性。
如果斷線是由於暫時性的失敗(例如暫時性的網路中斷)所導致,且目標伺服器未重新啟動,則假設用戶端斷線的時間未超過 connection-ttl 的時間,工作階段仍會存在於伺服器上。
在這種情況下,用戶端工作階段將在重新連線後自動重新附加到伺服器工作階段。此過程是 100% 透明的,用戶端可以繼續操作,就好像什麼都沒發生過一樣。
其運作方式如下
當 Apache ActiveMQ Artemis 用戶端將命令傳送至其伺服器時,它們會將每個傳送的命令儲存在記憶體緩衝區中。如果發生連線失敗,且用戶端隨後重新附加到同一伺服器,作為重新附加協定的一部分,伺服器會在重新附加期間通知用戶端它成功接收到來自該用戶端的最後一個命令的 ID。
如果用戶端傳送的命令多於容錯移轉前接收到的命令,它可以從其緩衝區重播任何傳送的命令,以便用戶端和伺服器可以協調它們的狀態。Ac
此緩衝區的大小是透過連線 URL 上的 confirmationWindowSize
參數設定的。當伺服器接收到 confirmationWindowSize
位元組的命令並處理它們時,它將向用戶端傳回命令確認,然後用戶端可以釋放緩衝區中的空間。
視窗是以位元組為單位指定。
將此參數設定為 -1
會停用任何緩衝,並防止發生任何重新附加,強制改為重新連線。此參數的預設值為 -1
。(這表示預設情況下不會發生自動重新附加)
2. 重新連線到備份伺服器
將 reconnectAttempts
設定為任何非零值,並將 ha
設定為 true
以重新連線到備份伺服器,詳細資訊請參閱重新連線和容錯移轉屬性。
可以透過多種不同的方式設定用戶端以探索活動備份伺服器群組的清單。它們可以明確設定,或最常見的方式是使用伺服器探索,讓用戶端自動探索清單。如需如何設定伺服器探索的完整詳細資訊,請參閱叢集。或者,用戶端可以明確連線到特定伺服器並下載目前的伺服器和備份,請參閱叢集。
預設情況下,只有在至少建立一個連線之後才會發生容錯移轉。換句話說,預設情況下,如果用戶端無法建立初始連線,則不會發生容錯移轉 - 在這種情況下,它只會根據 reconnect-attempts 屬性重試連線,並在此嘗試次數之後失敗。
3. 重新連線到其他活動伺服器
將 failoverAttempts
設定為任何非零值,以重新連線到其他活動伺服器,詳細資訊請參閱重新連線和容錯移轉屬性。
如果 reconnectAttempts
值不為零,則只有在所有重新連線到同一伺服器或重新連線到備份伺服器的嘗試都失敗後,用戶端才會嘗試重新連線到其他活動伺服器。
4. 工作階段重新連線
當用戶端在重新啟動後重新連線到同一伺服器、重新連線到備份伺服器或重新連線到其他活動伺服器時,任何工作階段將不再存在於伺服器上,並且無法 100% 透明地重新附加到它們。在這種情況下,用戶端上的任何工作階段和取用者都將在伺服器上自動重新建立。
用戶端重新連線也由內部元件(例如核心橋接器)使用,以允許它們重新連線到其目標伺服器。
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
。