日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 弹性和瞬态故障处理库Polly 学习

發(fā)布時間:2023/12/4 C# 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 弹性和瞬态故障处理库Polly 学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。