Dubbo3 集群容錯

2022-04-01 17:04 更新

集群調(diào)用失敗時,Dubbo 提供的容錯方案

在集群調(diào)用失敗時,Dubbo 提供了多種容錯方案,缺省為 failover 重試。

cluster

各節(jié)點(diǎn)關(guān)系:

  • 這里的 ?Invoker ?是 ?Provider ?的一個可調(diào)用 ?Service ?的抽象,?Invoker ?封裝了 ?Provider ?地址及 ?Service ?接口信息
  • ?Directory ?代表多個 ?Invoker?,可以把它看成 ?List<Invoker>? ,但與 ?List ?不同的是,它的值可能是動態(tài)變化的,比如注冊中心推送變更
  • ?Cluster ?將 ?Directory ?中的多個 ?Invoker ?偽裝成一個 ?Invoker?,對上層透明,偽裝過程包含了容錯邏輯,調(diào)用失敗后,重試另一個
  • ?Router ?負(fù)責(zé)從多個 ?Invoker ?中按路由規(guī)則選出子集,比如讀寫分離,應(yīng)用隔離等
  • ?LoadBalance ?負(fù)責(zé)從多個 ?Invoker ?中選出具體的一個用于本次調(diào)用,選的過程包含了負(fù)載均衡算法,調(diào)用失敗后,需要重選

集群容錯模式

可以自行擴(kuò)展集群容錯策略,參見:集群擴(kuò)展

Failover Cluster

失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲。可通過? retries="2" ?來設(shè)置重試次數(shù)(不含第一次)。

重試次數(shù)配置如下:

<dubbo:service retries="2" />

<dubbo:reference retries="2" />

<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
提示
該配置為缺省配置

Failfast Cluster

快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。

Failsafe Cluster

失敗安全,出現(xiàn)異常時,直接忽略。通常用于寫入審計日志等操作。

Failback Cluster

失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。

Forking Cluster

并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實(shí)時性要求較高的讀操作,但需要浪費(fèi)更多服務(wù)資源??赏ㄟ^ ?forks="2" ?來設(shè)置最大并行數(shù)。

Broadcast Cluster

廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。

現(xiàn)在廣播調(diào)用中,可以通過 broadcast.fail.percent 配置節(jié)點(diǎn)調(diào)用失敗的比例,當(dāng)達(dá)到這個比例后,BroadcastClusterInvoker 將不再調(diào)用其他節(jié)點(diǎn),直接拋出異常。 broadcast.fail.percent 取值在 0~100 范圍內(nèi)。默認(rèn)情況下當(dāng)全部調(diào)用失敗后,才會拋出異常。 broadcast.fail.percent 只是控制的當(dāng)失敗后是否繼續(xù)調(diào)用其他節(jié)點(diǎn),并不改變結(jié)果(任意一臺報錯則報錯)。broadcast.fail.percent 參數(shù) 在 dubbo2.7.10 及以上版本生效。

Broadcast Cluster 配置 broadcast.fail.percent。

broadcast.fail.percent=20 代表了當(dāng) 20% 的節(jié)點(diǎn)調(diào)用失敗就拋出異常,不再調(diào)用其他節(jié)點(diǎn)。

@reference(cluster = "broadcast", parameters = {"broadcast.fail.percent", "20"})
提示
?2.1.0?開始支持

Available Cluster

調(diào)用目前可用的實(shí)例(只調(diào)用一個),如果當(dāng)前沒有可用的實(shí)例,則拋出異常。通常用于不需要負(fù)載均衡的場景。

Mergeable Cluster

將集群中的調(diào)用結(jié)果聚合起來返回結(jié)果,通常和group一起配合使用。通過分組對結(jié)果進(jìn)行聚合并返回聚合后的結(jié)果,比如菜單服務(wù),用group區(qū)分同一接口的多種實(shí)現(xiàn),現(xiàn)在消費(fèi)方需從每種group中調(diào)用一次并返回結(jié)果,對結(jié)果進(jìn)行合并之后返回,這樣就可以實(shí)現(xiàn)聚合菜單項(xiàng)。

ZoneAware Cluster

多注冊中心訂閱的場景,注冊中心集群間的負(fù)載均衡。對于多注冊中心間的選址策略有如下四種

  1. 指定優(yōu)先級:?preferred="true"?注冊中心的地址將被優(yōu)先選擇
    <dubbo:registry address="zookeeper://127.0.0.1:2181" preferred="true" />
  2. 同中心優(yōu)先:檢查當(dāng)前請求所屬的區(qū)域,優(yōu)先選擇具有相同區(qū)域的注冊中心
    <dubbo:registry address="zookeeper://127.0.0.1:2181" zone="beijing" />
  3. 權(quán)重輪詢:根據(jù)每個注冊中心的權(quán)重分配流量
    <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" />
  4. 缺省值:選擇一個可用的注冊中心

集群模式配置

按照以下示例在服務(wù)提供方和消費(fèi)方配置集群模式

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號