ActiveMQ故障轉移傳輸

故障轉移傳輸層重新連接任何其他傳輸器之上的邏輯。配置語法允許您指定任意數量的複合URI。故障轉移傳輸隨機選擇一個複合URI,並嘗試建立與之的連接。如果它不成功,或者如果隨後失敗,則從列表中隨機選擇一個其他URI,建立一個新的連接。

 

配置語法

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

要麼

failover:uri1,...,uriN

 

例:

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

運輸選項

選項名稱

默認值

描述

backup

false

初始化並保持第二個傳輸連接 - 啓用快速故障轉移。

initialReconnectDelay

10

第一次重新連接嘗試之前的延遲(以ms爲單位)。

maxCacheSize

131072

跟蹤消息緩存的大小(字節)。

適用前提trackMessagestrue

maxReconnectAttempts

-1 | 0

從ActiveMQ 5.6:默認是-1,永遠重試。0意味着禁用重新連接,例如:只嘗試連接一次。
在ActiveMQ 5.6之前:默認是0,永遠重試。
所有ActiveMQ版本:一個值>0表示將錯誤發送回客戶端之前的重新連接嘗試的最大次數。

maxReconnectDelay

30000

第二次和隨後的重新連接嘗試之間的最大延遲(以毫秒爲單位)

nested.*

null

從ActiveMQ 5.9:將應用於列表中每個URI的常用URI選項

randomize

true

如果true,從列表中隨機選擇一個用於重新連接的URI。

reconnectDelayExponent

2.0

在指數退避嘗試期間使用的指數。

reconnectSupported

true

確定客戶端是否應該使用重新連接來響應代理ConnectionControl事件(請參閱:)rebalanceClusterClients

startupMaxReconnectAttempts

-1

-1表示啓動時的連接嘗試次數應爲無限制。

值  >=0 表示啓動時重新連接嘗試的次數,當客戶端進行後續重新連接嘗試時,將發送錯誤發送回客戶端。

注意:一旦成功連接,該maxReconnectAttempts選項佔優勢。

timeout

-1

從ActiveMQ 5.3:設置發送操作的超時(以毫秒爲單位),而不會中斷重連接進程。 

trackMessages

false

保留在重新連接時刷新到代理的快速消息。

updateURIsSupported

true

從ActiveMQ 5.4:確定客戶端是否應該接受從代理到其已知URI列表的更新。

updateURIsURL

null

從ActiveMQ 5.4:到文本文件的URL(或本地文件的路徑),該文本文件包含在出現故障時用於重新連接的逗號分隔的URI列表。

useExponentialBackOff

true

如果true在重新連接嘗試之間使用指數退避。

warnAfterReconnectAttempts

10

從ActiveMQ 5.10:一個值>0指定在記錄警告之前的重新連接嘗試的次數。記錄的警告表示沒有當前連接,但正在嘗試重新連接。

<=0禁用對重新連接嘗試的警告記錄的值。 

 

使用隨機化

默認情況下,故障切換傳輸隨機選擇一個URI。這有效地平衡了多個經紀人的客戶端。但是,要使客戶端連接到主服務器,並且僅在主服務器不可用時才連接到輔助備用代理程序randomize=false

例:

failover:(tcp:// primary:61616,tcp:// secondary:61616)?randomize = false
筆記

在故障轉移傳輸發送操作下,默認情況下,當代理變得不可用時,將無限期地阻止。有兩個可用於處理此方案的選項。首先,無論是設置一個TransportListener上直接ActiveMQConnectionFactory,使其處於適當位置,可能需要一個網絡跳或第二,設置任何請求之前timeout選擇。該timeout選項使當前發送操作在指定的超時後失敗。

例:

故障轉移:(tcp:// primary:61616)?timeout = 3000

在此示例中,如果連接未建立,則發送操作將在3秒後超時。重要的是要注意,當超時發生時連接不會被殺死。因此,有可能在經紀人變得可用後再次使用相同的連接重新發送受影響的消息。

交易

默認情況下,故障轉移傳輸跟蹤事務。重新連接時重播飛行中的交易。對於簡單的情況,這可以按預期方式工作。然而,關於確認(或消費者)交易存在一種假設,因爲先前接收到的消息將在重新連接時自動重播。然而,當有許多連接和消費者時,這並不總是正確的,因爲重新發送訂單不能保證,因爲陳舊的確認可能會干擾新傳遞的消息。這可能導致未確認的消息。

從ActiveMQ 5.3.1:跟蹤重新發送順序如果在故障切換後未重新傳遞未完成的消息,則事務將無法提交。javax.jms.TransactionRolledBackException如果提交失敗,則拋出A。有疑問的交易將導致回滾,以便可以由應用程序重播。當提交消息在飛行中時,發生故障轉移時,會發生疑難事務。不可能知道確切的故障點。發生故障是因爲事務提交消息未傳遞或提交回復丟失?在任一情況下,有必要回滾事務,以便應用程序可以獲得失敗的指示並處理任何潛在的問題。

用於故障切換的代理端選項

從ActiveMQ 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客戶端只需要配置集羣中的一個代理的詳細信息才能連接。

例:

故障轉移:(tcp:// primary:61616)

當新經紀人加入羣集時,客戶端將被自動通知新代理的URI。當其他已知代理商之一變得不可用時,新的URI可用於故障轉移。

附加信息

請參閱以下博客條目,瞭解如何使用羣集客戶端更新和重新平衡功能,標題爲ActiveMQ 5.4中的新功能:自動羣集更新和重新平衡
優先備份

從ActiveMQ 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 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章