c# 彈性和瞬態故障處理庫Polly 學習
關於Polly
Polly是一個基於.NET的彈性及瞬態故障處理庫,允許開發人員以順暢及執行緒安全的方式執行重試(Retry)、斷路(Circuit Breaker)、超時(Timeout) 、
隔離(Bulkhead Isolation)和回退策略(Fallback ). Polly適用於 .NET 4.0, .NET 4.5 和.NET Standard 1.1。
以上是官方文件對polly庫的介紹。
polly的介紹中有個很關鍵的詞是瞬態故障,這個詞也很好的詮釋了Polly使用的一個背景.瞬態故障,就是指我們的程式在運行當中可能會發生故障,
這些故障包含程式執行中的異常、返回結果不符等。彈性是指Polly在應對這些故障時具有靈活性,且其提供的策略也可以很靈活的組合在一起使用。
Polly的使用
方式1:在Nuget中下載Polly安裝包,安裝成功即可使用
Install-Package Polly
方式2:在github中下載Polly原始碼
ofollow,noindex">https://github.com/App-vNext/Polly
Polly策略
一、重試(Retry)
異常重試是最常使用的一個策略,其功能是當我們執行的方法體發生異常時,可以按照我們指定的次數進行重試
Policy .Handle<NullReferenceException>()//指定需要重試的異常型別 .Retry(2,(ex,count,context)=> {//指定發生異常重試的次數 Console.WriteLine($"重試次數{count},異常{ex.Message}"); }) .Execute(() => Console.Write("execute method!"));//要執行的方法
Polly的所有策略使用都支援鏈式呼叫。
Polly重試策略的使用分為三個步驟
1、指定需要處理的異常
可以指定捕獲執行的任務的異常型別,若執行任務的異常型別滿足指定異常,那麼重試機制將會生效
2、指定重試次數和監控重試
指定整個執行過程中需要重試多少次,且可以監控每次的重試資訊,比如重試次數 異常以及重試的上下文資訊
3、指定執行的任務
指定執行的任務是整個異常重試的核心和監控物件,Execute支援多種過載.。
重試策略支援非同步任務
1public async Task PollyStudy() 2{ 3int num = await Policy 4.Handle<Exception>() 5.RetryAsync(2, (ex, count, context) => 6{ 7Console.WriteLine($"重試次數{count},異常{ex.Message}"); 8}) 9.ExecuteAsync<int>(() => 10{ 11return GetNum(); 12}); 13} 14 15public async Task<int> GetNum() 16{ 17await Task.Delay(10000); 18return 1; 19} View Code
二、超時(Timeout)
超時策略主要用於對任務執行的執行時長監控,若任務執行超出指定執行時長,那麼我們就認為這次任務執行是失敗的,
不會再去等待結果
超時策略最基本的設定:
Policy .Timeout(10, (context, timeSpan, task) => { Console.WriteLine("1"); });
三、熔斷( Circuit-breaker )
熔斷在這裡的含義在執行某個任務時,多次重試依然出現超時或則異常,且重試的次數已經超過了系統設定上限.
那麼就中斷當前的執行,快速響應失敗資訊給使用者,等待一段時間再進行恢復,繼續執行.
var breakerPlocy = Policy.Handle<Exception>()//指定異常 .CircuitBreaker(5, TimeSpan.FromSeconds(30),//設定5次閥值,中斷30秒 onBreak: (ex, timeSpan) => { Console.WriteLine("onBreak"); }, //中斷回撥 onReset: () => { Console.WriteLine("onReset"); });//重置回撥
熔斷的基本策略設定如上程式碼所示,上面的程式碼可以解析為當某個任務超過5次異常時,我們進行中斷處理,等待30秒後再次繼續.
我們設定了 中斷回撥和重啟回撥函式,可以記錄當中的執行資訊.
四、 回退(Fallback)
回退策略的前置條件是當我們的操作註定會失敗時,我們就需要有一個合理的返回資訊來替代失敗資訊,也就是提供一個備用方案,
從而能對我們的失敗操作進行挽救.
Policy .Handle<Exception>() .Fallback(fallbackAction: () => { }, onFallback: (ex) => { });
回退策略的基本設定如上所示,我們可以定義備用的返回資訊,同時可以定義回撥
五、隔板隔離策略
隔板隔離的前置條件是當程序出現故障時,多個失敗一直在主機中對資源一直佔用。下游系統故障也可能導致上游系統的故障,
這些風險都可能導致系統產生嚴重的後果.而隔板隔離策略可以隔離有相互影響的操作,將受管制的草需哦限制在一個固定的 資源池中
Policy.Bulkhead(10, 15, (context) => { });
指定最大的執行緒數,和正在排隊的佇列數,若執行被拒絕,則執行回撥.
六、快取策略
快取策略的前置條件是我們的資料更新週期較長且使用頻繁,我們可以首次載入這些資料時將這些資料快取起來,
如果資料已經存在那麼我們直接從快取中讀取.
ISyncCacheProvider cacheProvider = new StubCacheProvider(); Func<Context, string> cacheKeyStrategy = null; Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy);
快取策略在某些情況下簡化我們的快取實現是很有幫助的.
七、策略包裝策略
策略包裝策略的前置條件是不同的異常需要不同的策略,也就是需要我們彈性的使用策略來應對不同的異常資訊.
NoOpPolicy policy0 = Policy.NoOp(); NoOpPolicy policy1 = Policy.NoOp(); NoOpPolicy policy2 = Policy.NoOp(); PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);
總結
上面簡單介紹了polly七大策略和其基本配置,Polly實際功能很強大,是一個很值得仔細學習的庫.
後面會詳細介紹Polly的幾大策略以及在實際專案中的一個應用