c# 弹性和瞬态故障处理库Polly 学习
關(guān)于Polly
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
?? Polly是一個基于.NET的彈性及瞬態(tài)故障處理庫,允許開發(fā)人員以順暢及線程安全的方式執(zhí)行重試(Retry)、斷路(Circuit Breaker)、超時(Timeout)、
? ? ?隔離(Bulkhead Isolation)和回退策略(Fallback?).Polly適用于 .NET 4.0, .NET 4.5 和.NET Standard 1.1。
? ? ?以上是官方文檔對polly庫的介紹。
? ? ?polly的介紹中有個很關(guān)鍵的詞是瞬態(tài)故障,這個詞也很好的詮釋了Polly使用的一個背景.瞬態(tài)故障,就是指我們的程序在運行當中可能會發(fā)生故障,
? ? ?這些故障包含程序運行中的異常、返回結(jié)果不符等。彈性是指Polly在應(yīng)對這些故障時具有靈活性,且其提供的策略也可以很靈活的組合在一起使用。
Polly的使用
? ??方式1:在Nuget中下載Polly安裝包,安裝成功即可使用
? ? ? ? ? ? ? ? ??Install-Package Polly
? ? ?方式2:在github中下載Polly源碼
? ? ? ? ? ? ? ? ?https://github.com/App-vNext/Polly
Polly策略
?
? ?一、重試(Retry)
? ? ? ?異常重試是最常使用的一個策略,其功能是當我們執(zhí)行的方法體發(fā)生異常時,可以按照我們指定的次數(shù)進行重試
| Policy.Handle<NullReferenceException>()???//指定需要重試的異常類型.Retry(2,(ex,count,context)=> {?????//指定發(fā)生異常重試的次數(shù)????Console.WriteLine($"重試次數(shù){count},異常{ex.Message}");})?????????????????????????????????????????.Execute(() => Console.Write("execute method!"));????//要執(zhí)行的方法 |
???Polly的所有策略使用都支持鏈式調(diào)用。
? ? ? Polly重試策略的使用分為三個步驟
? ?1、指定需要處理的異常
? ? ? ? ?可以指定捕獲執(zhí)行的任務(wù)的異常類型,若執(zhí)行任務(wù)的異常類型滿足指定異常,那么重試機制將會生效
? ???2、指定重試次數(shù)和監(jiān)控重試
? ? ??? 指定整個執(zhí)行過程中需要重試多少次,且可以監(jiān)控每次的重試信息,比如重試次數(shù)? 異常以及重試的上下文信息
? ?3、指定執(zhí)行的任務(wù)
? ? ? ? 指定執(zhí)行的任務(wù)是整個異常重試的核心和監(jiān)控對象,Execute支持多種重載.。
? ? ? ? ? 重試策略支持異步任務(wù)? ? ??
public async Task PollyStudy()
? ? ? ? {
? ? ? ? ? ? int num = await Policy
? ? ? ? ? ? ? ? .Handle<Exception>()
? ? ? ? ? ? ? ? .RetryAsync(2, (ex, count, context) =>
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine($"重試次數(shù){count},異常{ex.Message}");
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .ExecuteAsync<int>(() =>
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return GetNum();
? ? ? ? ? ? ? ? });
? ? ? ? }
? ? ? ? public async Task<int> GetNum()
? ? ? ? {
? ? ? ? ? ? await Task.Delay(10000);
? ? ? ? ? ? return 1;
? ? ? ? }
? 二、超時(Timeout)?
? ? ? ?超時策略主要用于對任務(wù)執(zhí)行的執(zhí)行時長監(jiān)控,若任務(wù)執(zhí)行超出指定執(zhí)行時長,那么我們就認為這次任務(wù)執(zhí)行是失敗的,
? ? ? 不會再去等待結(jié)果
? ? ? ?超時策略最基本的設(shè)置:
? ? ? ? ? ? Policy.Timeout(10, (context, timeSpan, task) =>{Console.WriteLine("1");});? ?三、熔斷(Circuit-breaker)? ??
? ? ?熔斷在這里的含義在執(zhí)行某個任務(wù)時,多次重試依然出現(xiàn)超時或則異常,且重試的次數(shù)已經(jīng)超過了系統(tǒng)設(shè)定上限.
? ? ?那么就中斷當前的執(zhí)行,快速響應(yīng)失敗信息給用戶,等待一段時間再進行恢復,繼續(xù)執(zhí)行.
| var?breakerPlocy = Policy.Handle<Exception>()?????//指定異常?????????????????????????.CircuitBreaker(5, TimeSpan.FromSeconds(30),???????????????//設(shè)置5次閥值,中斷30秒?????????????????????????onBreak: (ex, timeSpan) => { Console.WriteLine("onBreak"); },?//中斷回調(diào)?????????????????????????onReset: () => { Console.WriteLine("onReset"); });????????????//重置回調(diào) |
? ??熔斷的基本策略設(shè)置如上代碼所示,上面的代碼可以解析為當某個任務(wù)超過5次異常時,我們進行中斷處理,等待30秒后再次繼續(xù).
? ? 我們設(shè)置了中斷回調(diào)和重啟回調(diào)函數(shù),可以記錄當中的執(zhí)行信息.
??四、回退(Fallback)
? ?回退策略的前置條件是當我們的操作注定會失敗時,我們就需要有一個合理的返回信息來替代失敗信息,也就是提供一個備用方案,
? ?從而能對我們的失敗操作進行挽救.
| Policy????????.Handle<Exception>()????????????????????????.Fallback(fallbackAction: () => { }, onFallback: (ex) => { });?? |
? ??回退策略的基本設(shè)置如上所示,我們可以定義備用的返回信息,同時可以定義回調(diào)
? ?五、隔板隔離策略
? ??隔板隔離的前置條件是當進程出現(xiàn)故障時,多個失敗一直在主機中對資源一直占用。下游系統(tǒng)故障也可能導致上游系統(tǒng)的故障,
? ?這些風險都可能導致系統(tǒng)產(chǎn)生嚴重的后果.而隔板隔離策略可以隔離有相互影響的操作,將受管制的草需哦限制在一個固定的資源池中
? ? ? ? ? ?Policy.Bulkhead(10, 15, (context) => { });?指定最大的線程數(shù),和正在排隊的隊列數(shù),若執(zhí)行被拒絕,則執(zhí)行回調(diào).
?六、緩存策略
??緩存策略的前置條件是我們的數(shù)據(jù)更新周期較長且使用頻繁,我們可以首次加載這些數(shù)據(jù)時將這些數(shù)據(jù)緩存起來,
? 如果數(shù)據(jù)已經(jīng)存在那么我們直接從緩存中讀取.?
| ISyncCacheProvider cacheProvider =?new?StubCacheProvider();????????????Func<Context,?string> cacheKeyStrategy =?null;????????????Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy); |
??緩存策略在某些情況下簡化我們的緩存實現(xiàn)是很有幫助的.
七、策略包裝策略
??策略包裝策略的前置條件是不同的異常需要不同的策略,也就是需要我們彈性的使用策略來應(yīng)對不同的異常信息.
| NoOpPolicy policy0 = Policy.NoOp();???????????NoOpPolicy policy1 = Policy.NoOp();???????????NoOpPolicy policy2 = Policy.NoOp();???????????PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2); |
總結(jié)
??上面簡單介紹了polly七大策略和其基本配置,Polly實際功能很強大,是一個很值得仔細學習的庫.
? 后面會詳細介紹Polly的幾大策略以及在實際項目中的一個應(yīng)用
相關(guān)文章:
.NET 開源項目 Polly 介紹
HttpClientFactory系列二:集成Polly處理瞬態(tài)故障
在 .NET Core 中結(jié)合 HttpClientFactory 使用 Polly(上篇)
在 .NET Core 中結(jié)合 HttpClientFactory 使用 Polly(中篇)
在 .NET Core 中結(jié)合 HttpClientFactory 使用 Polly(下篇)
AspNetCore 基于AOP實現(xiàn)Polly的使用
使用.NetCore 控制臺演示 熔斷 降級(polly)
.NET Core微服務(wù)之基于Polly+AspectCore實現(xiàn)熔斷與降級機制
原文地址:?https://www.cnblogs.com/xxue/p/9902669.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的c# 弹性和瞬态故障处理库Polly 学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BotSharp v0.2 发布, 支持
- 下一篇: swagger文档转换为WebApiCl