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源碼
? ? ? ? ? ? ? ? ?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支持多種重載.。
? ? ? ? ? 重試策略支持異步任務? ? ??
public async Task PollyStudy()
? ? ? ? {
? ? ? ? ? ? int num = await Policy
? ? ? ? ? ? ? ? .Handle<Exception>()
? ? ? ? ? ? ? ? .RetryAsync(2, (ex, count, context) =>
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine($"重試次數{count},異常{ex.Message}");
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .ExecuteAsync<int>(() =>
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return GetNum();
? ? ? ? ? ? ? ? });
? ? ? ? }
? ? ? ? public async Task<int> GetNum()
? ? ? ? {
? ? ? ? ? ? await Task.Delay(10000);
? ? ? ? ? ? return 1;
? ? ? ? }
? 二、超時(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的幾大策略以及在實際項目中的一個應用
相關文章:
.NET 開源項目 Polly 介紹
HttpClientFactory系列二:集成Polly處理瞬態故障
在 .NET Core 中結合 HttpClientFactory 使用 Polly(上篇)
在 .NET Core 中結合 HttpClientFactory 使用 Polly(中篇)
在 .NET Core 中結合 HttpClientFactory 使用 Polly(下篇)
AspNetCore 基于AOP實現Polly的使用
使用.NetCore 控制臺演示 熔斷 降級(polly)
.NET Core微服務之基于Polly+AspectCore實現熔斷與降級機制
原文地址:?https://www.cnblogs.com/xxue/p/9902669.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的c# 弹性和瞬态故障处理库Polly 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BotSharp v0.2 发布, 支持
- 下一篇: swagger文档转换为WebApiCl