叢集容錯
叢集調用失敗時,Dubbo 提供了多種容錯方案,默認為故障轉移重試。
各個節點關係
- 這裡
Invoker
是Provider
的抽象,可以調用Service
,Invoker
封裝了Provider
地址和Service
介面資訊 Directory
代表多個Invoker
,可以看作是List<Invoker>
,但不同於List
,它的值可能動態變化,例如註冊中心推送變更Cluster
將Directory
中的多個Invoker
偽裝成一個Invoker
,對上層透明。偽裝的過程中包含了容錯邏輯,調用失敗後嘗試另一個Router
負責根據路由規則從多個Invoker
中選擇子集,例如讀寫分離、應用隔離等。LoadBalance
負責從多個Invoker
中選擇一個具體的進行本次調用,選擇的過程包含負載均衡算法,調用失敗後需要重新選擇
叢集容錯模式
你可以自行擴展叢集容錯策略,詳見:叢集擴展
故障轉移叢集
失敗自動切換,當出現失敗時,重試其他伺服器。通常用於讀操作,但重試會引入更長的延遲。可以通過 retries="2"
設定重試次數(不包括第一次)。
重試次數配置如下
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
提示
此配置為預設配置快速失敗叢集
快速失敗,只進行一次呼叫,失敗則立即回報錯誤。通常用於非冪等寫操作,例如新增記錄。
故障安全叢集 (Failsafe Cluster)
故障安全,發生異常時,直接忽略。通常用於寫審計日誌等操作。
故障恢復叢集 (Failback Cluster)
故障自動恢復,失敗的請求會在背景記錄,並定時重新發送。通常用於訊息通知操作。
Forking 叢集 (Forking Cluster)
並行呼叫多個伺服器,只要有一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可透過 forks="2"
設定最大並行度。
廣播叢集 (Broadcast Cluster)
廣播呼叫所有提供者,逐個呼叫,任意一個報錯則報錯。通常用於通知所有提供者更新本地資源資訊,例如快取或日誌。
現在在廣播呼叫中,可以透過 broadcast.fail.percent 設定節點呼叫的失敗比例。達到該比例後,BroadcastClusterInvoker 將不再呼叫其他節點,直接拋出異常。broadcast.fail.percent 的取值範圍為 0 到 100。預設情況下,所有呼叫失敗時才會拋出異常。broadcast.fail.percent 僅控制失敗後是否繼續呼叫其他節點,不改變結果(任意節點報錯則報錯)。broadcast.fail.percent 參數在 dubbo2.7.10 及以上版本生效。
廣播叢集設定 broadcast.fail.percent。
broadcast.fail.percent=20 表示當 20% 的節點呼叫失敗時,將拋出異常,不再呼叫其他節點。
@reference(cluster = "broadcast", parameters = {"broadcast. fail. percent", "20"})
提示
2.1.0
版本開始支援可用叢集 (Available Cluster)
呼叫目前可用的執行個體(只呼叫一個),若目前沒有可用的執行個體,則拋出異常。通常用於不需要負載平衡的場景。
合併叢集 (Mergeable Cluster)
在叢集內聚合呼叫結果並返回,通常跟 group 配合使用。按照分組聚合結果並返回聚合結果,例如選單服務,用 group 區分同一個介面的多個實現,現在消費者需要從每一個 group 都呼叫一次並返回結果,合併後再返回,這樣就可以實現聚合選單項。
區域感知叢集 (ZoneAware Cluster)
在多註冊中心訂閱的場景下,實現註冊中心叢集間的負載均衡。多個註冊中心之間的地址選擇有四種策略
- 指定優先:
preferred="true"
的註冊中心的地址會被優先選擇
<dubbo:registry address="zookeeper://127.0.0.1:2181" preferred="true" />
- 同區域優先:檢查目前請求所屬的區域,優先選擇同區域的註冊中心
<dubbo:registry address="zookeeper://127.0.0.1:2181" zone="beijing" />
- 權重輪詢:根據各個註冊中心的權重分配流量
<dubbo:registry id="beijing" address="zookeeper://127.0.0.1:2181" weight="100" />
<dubbo:registry id="shanghai" address="zookeeper://127.0.0.1:2182" weight="10" />
- 預設:選擇一個可用的註冊中心
叢集模式設定
按照以下範例在服務提供者和消費者端設定叢集模式
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />