故障轉移傳輸層重新連接任何其他傳輸器之上的邏輯。配置語法允許您指定任意數量的複合URI。故障轉移傳輸隨機選擇一個複合URI,並嘗試建立與之的連接。如果它不成功,或者如果隨後失敗,則從列表中隨機選擇一個其他URI,建立一個新的連接。
配置語法
failover:(uri1,...,uriN)?transportOptions&nestedURIOptions
要麼
failover:uri1,...,uriN
例:
failover:(tcp:// localhost:61616,tcp:// remotehost:61616)?initialReconnectDelay = 100
運輸選項
選項名稱 |
默認值 |
描述 |
---|---|---|
|
|
初始化並保持第二個傳輸連接 - 啓用快速故障轉移。 |
|
|
在第一次重新連接嘗試之前的延遲(以ms爲單位)。 |
|
|
跟蹤消息緩存的大小(字節)。
適用前提 |
|
|
從ActiveMQ 5.6:默認是 |
|
|
第二次和隨後的重新連接嘗試之間的最大延遲(以毫秒爲單位)。 |
|
|
從ActiveMQ 5.9:將應用於列表中每個URI的常用URI選項。 |
|
|
如果 |
|
|
在指數退避嘗試期間使用的指數。 |
|
|
確定客戶端是否應該使用重新連接來響應代理 |
|
|
值
值
注意:一旦成功連接,該 |
|
|
從ActiveMQ 5.3:設置發送操作的超時(以毫秒爲單位),而不會中斷重連接進程。 |
|
|
保留在重新連接時刷新到代理的快速消息。 |
|
|
從ActiveMQ 5.4:確定客戶端是否應該接受從代理到其已知URI列表的更新。 |
|
|
從ActiveMQ 5.4:到文本文件的URL(或本地文件的路徑),該文本文件包含在出現故障時用於重新連接的逗號分隔的URI列表。 |
|
|
如果 |
|
|
從ActiveMQ 5.10:一個值
|
使用隨機化
默認情況下,故障切換傳輸隨機選擇一個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
有可用的選項,以便代理可以自動更新客戶機,以瞭解有關可用(或不再可用)故障轉移的新代理商的存在的信息。
選項是:
選項名稱 |
默認值 |
描述 |
---|---|---|
|
|
如果 |
|
|
如果 |
|
|
如果 |
|
|
逗號分隔的正則表達式過濾器列表,用於匹配經紀人的代理名稱,以指定爲客戶端的故障轉移羣集的一部分。 |
例:
< 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.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 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