1. 程式人生 > >c# 彈性和瞬態故障處理庫Polly 學習

c# 彈性和瞬態故障處理庫Polly 學習

ret 一起 重置 clas fun ext pen 故障處理 try

關於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源碼

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支持多種重載.。

重試策略支持異步任務

技術分享圖片
 1  public async Task PollyStudy()
 2         {
 3             int num = await Policy
 4                 .Handle<Exception>()
 5                 .RetryAsync(2, (ex, count, context) =>
 6                 {
 7                     Console.WriteLine($"重試次數{count},異常{ex.Message}");
 8                 })
 9                 .ExecuteAsync<int>(() =>
10                 {
11                     return GetNum();
12                 });
13         }
14 
15         public async Task<int> GetNum()
16         {
17             await Task.Delay(10000);
18             return 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的幾大策略以及在實際項目中的一個應用

c# 彈性和瞬態故障處理庫Polly 學習