容錯轉移傳輸參考
使用 ActiveMQ Classic > 設定傳輸 > ActiveMQ Classic 連接 URI > 容錯轉移傳輸參考
容錯轉移傳輸
容錯轉移傳輸在任何其他傳輸之上新增了重新連線邏輯。設定語法允許您指定任意數量的複合 URI。容錯轉移傳輸會隨機選擇其中一個複合 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 會停用記錄關於重新連線嘗試的警告。 |
使用隨機化
預設情況下,容錯轉移傳輸會隨機選擇一個 URI。這有效地在多個代理之間負載平衡客戶端。但是,若要讓客戶端先連線至主要代理,並且僅在主要代理無法使用時連線至次要備份代理,請設定 randomize=false
。
範例
failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false
注意事項
在容錯轉移傳輸下,當代理無法使用時,預設情況下,傳送操作將無限期地封鎖。有兩個選項可用於處理這種情況。首先,直接在 ActiveMQConnectionFactory 上設定 TransportListener,以便在任何可能需要網路躍點的要求之前就已就位,或者,設定 timeout
選項。timeout
選項會導致目前傳送操作在指定的逾時時間之後失敗。
範例
failover:(tcp://primary:61616)?timeout=3000
在此範例中,如果未建立連線,傳送操作將在 3 秒後逾時。請務必注意,發生逾時時不會終止連線。因此,一旦代理可用,就可以使用相同的連線稍後重新傳送受影響的訊息。
交易
預設情況下,容錯轉移傳輸會追蹤交易。處理中的交易會在重新連線時重新播放。對於簡單的情境,此操作如預期般運作。但是,關於已確認 (或消費者) 交易的假設是,先前收到的訊息將在重新連線時自動重新播放。然而,當有許多連線和消費者時,情況並非總是如此,因為重新傳遞順序未受保證,因為過時的未完成確認可能會干擾新傳遞的訊息。這可能會導致未確認的訊息。
從 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 的查詢字串來設定常見 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 選項和巢狀選項,則巢狀選項定義將優先。