叢集容錯

叢集調用失敗時,Dubbo 提供的容錯解決方案

叢集調用失敗時,Dubbo 提供了多種容錯方案,默認為故障轉移重試。

cluster

各個節點關係

  • 這裡 InvokerProvider 的抽象,可以調用 ServiceInvoker 封裝了 Provider 地址和 Service 介面資訊
  • Directory 代表多個 Invoker,可以看作是 List<Invoker>,但不同於 List,它的值可能動態變化,例如註冊中心推送變更
  • ClusterDirectory 中的多個 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"})

可用叢集 (Available Cluster)

呼叫目前可用的執行個體(只呼叫一個),若目前沒有可用的執行個體,則拋出異常。通常用於不需要負載平衡的場景。

合併叢集 (Mergeable Cluster)

在叢集內聚合呼叫結果並返回,通常跟 group 配合使用。按照分組聚合結果並返回聚合結果,例如選單服務,用 group 區分同一個介面的多個實現,現在消費者需要從每一個 group 都呼叫一次並返回結果,合併後再返回,這樣就可以實現聚合選單項。

區域感知叢集 (ZoneAware Cluster)

在多註冊中心訂閱的場景下,實現註冊中心叢集間的負載均衡。多個註冊中心之間的地址選擇有四種策略

  1. 指定優先:preferred="true"的註冊中心的地址會被優先選擇
<dubbo:registry address="zookeeper://127.0.0.1:2181" preferred="true" />
  1. 同區域優先:檢查目前請求所屬的區域,優先選擇同區域的註冊中心
<dubbo:registry address="zookeeper://127.0.0.1:2181" zone="beijing" />
  1. 權重輪詢:根據各個註冊中心的權重分配流量
<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" />
  1. 預設:選擇一個可用的註冊中心

叢集模式設定

按照以下範例在服務提供者和消費者端設定叢集模式

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />

最後修改日期:2023 年 1 月 2 日:增強英文文件 (#1798) (95a9f4f6c1c)