Dubbo集群容错
轉自dubbo官網文檔http://dubbo.apache.org/zh-cn/blog/dubbo-cluster-error-handling.html
Design For failure
在分布式系統中,集群某個某些節點出現問題是大概率事件,因此在設計分布式RPC框架的過程中,必須要把失敗作為設計的一等公民來對待。一次調用失敗之后,應該如何選擇對失敗的選擇策略,這是一個見仁見智的問題,每種策略可能都有自己獨特的應用場景。因此,作為框架來說,應當針對不同場景提供多種策略,供用戶進行選擇。
在Dubbo設計中,通過Cluster這個接口的抽象,把一組可供調用的Provider信息組合成為一個統一的Invoker供調用方進行調用。經過路由規則過濾,負載均衡選址后,選中一個具體地址進行調用,如果調用失敗,則會按照集群配置的容錯策略進行容錯處理。
Dubbo默認內置了若干容錯策略,如果不能滿足用戶需求,則可以通過自定義容錯策略進行配置。
內置容錯策略
Dubbo主要內置了如下幾種策略:
- Failover(失敗自動切換)
- Failsafe(失敗安全)
- Failfast(快速失敗)
- Failback(失敗自動恢復)
- Forking(并行調用)
- Broadcast(廣播調用)
這些名稱比較相似,概念也比較容易混淆,下面逐一進行解釋。
Failover(失敗自動切換)
Failover是高可用系統中的一個常用概念,服務器通常擁有主備兩套機器配置,如果主服務器出現故障,則自動切換到備服務器中,從而保證了整體的高可用性。
Dubbo也借鑒了這個思想,并且把它作為Dubbo默認的容錯策略。當調用出現失敗的時候,根據配置的重試次數,會自動從其他可用地址中重新選擇一個可用的地址進行調用,直到調用成功,或者是達到重試的上限位置。
Dubbo里默認配置的重試次數是2,也就是說,算上第一次調用,最多會調用3次。
其配置方法,容錯策略既可以在服務提供方配置,也可以服務調用方進行配置。而重試次數的配置則更為靈活,既可以在服務級別進行配置,也可以在方法級別進行配置。具體優先順序為:
服務調用方方法級配置 > 服務調用方服務級配置 > 服務提供方方法級配置 > 服務提供方服務級配置以XML方式為例,具體配置方法如下:
服務提供方,服務級配置
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" cluster="failover" retries="2" />服務提供方,方法級配置
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"cluster="failover"> <dubbo:method name="sayHello" retries="2" /> </dubbo:reference>服務調用方,服務級配置
<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" cluster="failover" retries="1"/>服務調用方,方法級配置:
<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" cluster="failover"> <dubbo:method name="sayHello" retries="3" /> </dubbo:reference>Failover可以自動對失敗進行重試,對調用者屏蔽了失敗的細節,但是Failover策略也會帶來一些副作用:
- 重試會額外增加一下開銷,例如增加資源的使用,在高負載系統下,額外的重試可能讓系統雪上加霜。
- 重試會增加調用的響應時間。
- 某些情況下,重試甚至會造成資源的浪費。考慮一個調用場景,A->B->C,如果A處設置了超時100ms,再B->C的第一次調用完成時已經超過了100ms,但很不幸B->C失敗,這時候會進行重試,但其實這時候重試已經沒有意義,因此在A看來這次調用已經超時,A可能已經開始執行其他邏輯。
Failsafe(失敗安全)
失敗安全策略的核心是即使失敗了也不會影響整個調用流程。通常情況下用于旁路系統或流程中,它的失敗不影響核心業務的正確性。在實現上,當出現調用失敗時,會忽略此錯誤,并記錄一條日志,同時返回一個空結果,在上游看來調用是成功的。
應用場景,可以用于寫入審計日志等操作。
?
Failfast(快速失敗)
某些業務場景中,某些操作可能是非冪等的,如果重復發起調用,可能會導致出現臟數據等。例如調用某個服務,其中包含一個數據庫的寫操作,如果寫操作完成,但是在發送結果給調用方的過程中出錯了,那么在調用發看來這次調用失敗了,但其實數據寫入已經完成。這種情況下,重試可能并不是一個好策略,這時候就需要使用到Failfast策略,調用失敗立即報錯。讓調用方來決定下一步的操作并保證業務的冪等性。
?
Failback(失敗自動恢復)
Failback通常和Failover兩個概念聯系在一起。在高可用系統中,當主機發生故障,通過Failover進行主備切換后,待故障恢復后,系統應該具備自動恢復原始配置的能力。
Dubbo中的Failback策略中,如果調用失敗,則此次失敗相當于Failsafe,將返回一個空結果。而與Failsafe不同的是,Failback策略會將這次調用加入內存中的失敗列表中,對于這個列表中的失敗調用,會在另一個線程中進行異步重試,重試如果再發生失敗,則會忽略,即使重試調用成功,原來的調用方也感知不到了。因此它通常適合于,對于實時性要求不高,且不需要返回值的一些異步操作。
?
按照目前的實現,Failback策略還有一些局限,例如內存中的失敗調用列表沒有上限,可能導致堆積,異步重試的執行間隔無法調整,默認是5秒。
Forking(并行調用)
上述幾種策略中,主要都是針對調用失敗發生后如何進行彌補的角度去考慮的,而Forking策略則跟上述幾種策略不同,是一種典型的用成本換時間的思路。即第一次調用的時候就同時發起多個調用,只要其中一個調用成功,就認為成功。在資源充足,且對于失敗的容忍度較低的場景下,可以采用此策略。
?
Broadcast(廣播調用)
在某些場景下,可能需要對服務的所有提供者進行操作,此時可以使用廣播調用策略。此策略會逐個調用所有提供者,只要任意有一個提供者出錯,則認為此次調用出錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。
?
各種策略對比
下表對各種策略做一個簡單對比,
| Failover | 對調用者屏蔽調用失敗的信息 | 增加RT,額外資源開銷,資源浪費 | 對調用rt不敏感的場景 |
| Failfast | 業務快速感知失敗狀態進行自主決策 | 產生較多報錯的信息 | 非冪等性操作,需要快速感知失敗的場景 |
| Failsafe | 即使失敗了也不會影響核心流程 | 對于失敗的信息不敏感,需要額外的監控 | 旁路系統,失敗不影響核心流程正確性的場景 |
| Failback | 失敗自動異步重試 | 重試任務可能堆積 | 對于實時性要求不高,且不需要返回值的一些異步操作 |
| Forking | 并行發起多個調用,降低失敗概率 | 消耗額外的機器資源,需要確保操作冪等性 | 資源充足,且對于失敗的容忍度較低,實時性要求高的場景 |
| Broadcast | 支持對所有的服務提供者進行操作 | 資源消耗很大 | 通知所有提供者更新緩存或日志等本地資源信息 |
自定義容錯策略
如果上述內置的容錯策略無法滿足你的需求,還可以通過擴展的方式來實現自定義容錯策略。
擴展接口
com.alibaba.dubbo.rpc.cluster.Cluster
擴展配置
<dubbo:service cluster="xxx" />擴展示例
下面通過一個例子來展示如何使用自定義的容錯策略。 Maven 項目結構:
src|-main|-java|-com|-xxx|-XxxCluster.java (實現Cluster接口)|-resources|-META-INF|-dubbo|-org.apache.dubbo.rpc.cluster.Cluster (純文本文件,內容為:xxx=com.xxx.XxxCluster)XxxCluster.java:
package com.xxx;import org.apache.dubbo.rpc.cluster.Cluster; import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker; import org.apache.dubbo.rpc.cluster.Directory; import org.apache.dubbo.rpc.cluster.LoadBalance; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcException; import java.util.List; public class XxxCluster implements Cluster {META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Cluster文件的內容為
xxx=com.xxx.XxxCluster轉載于:https://www.cnblogs.com/twoheads/p/10131929.html
總結
- 上一篇: oracle执行计划的rows不对,Or
- 下一篇: 可曾听闻【大话】二字