容錯轉移傳輸參考

使用 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 追蹤訊息快取的位元組大小。僅在 trackMessagestrue 時適用。
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 開始:如果本機和遠端網路中都有可用的代理,則可以使用 priorityBackuppriorityURIs 選項,指定偏好本機代理而不是遠端代理。

考量下列 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

在此情況下,客戶端將優先考慮 local1local2 代理,並在它們可用時 (重新) 連線至它們。

設定巢狀 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 選項巢狀選項,則巢狀選項定義將優先。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 The Apache Software Foundation 的商標。Copyright © 2024, The Apache Software Foundation。根據 Apache License 2.0 授權。