Polly 重试策略
生活随笔
收集整理的這篇文章主要介紹了
Polly 重试策略
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
工作原理
Retry
基本重試:
public static void Retry() {var random = new Random();// Policy<> 泛型定義返回值類型, 如若不需要返回值, 可直接使用 Policyvar obj = Policy<object>// Handle<> 可指定需要處理的異常類型.Handle<Exception>()//也可以使用重載對Exception 進行再次過濾//.Handle<Exception>(e => e is NotSupportedException) .Retry(3, (res, i, c) =>{//當委托的代碼塊執行失敗時會進入此 Action, //這里可以對拋出的異常進行日志或其他處理Console.WriteLine($"retry {i}th times, ex: {res.Exception?.Message}");}).Execute(() =>{var val = random.Next(0, 100);switch (val % 3){case 0:return "Success";default:throw new Exception($"random val: {val}");}});Console.WriteLine(obj); }輸出:
重試一次成功:
重試兩次成功:
重試三次均失敗:
可以看到,再超過重試次數的時候, 若程序還是異常,則拋出異常。
RetryForever
成功前一直重試:
public static void RetryForever() {var random = new Random();// Policy<> 泛型定義返回值類型, 如若不需要返回值, 可直接使用 Policyvar obj = Policy<object>// Handle<> 可指定需要處理的異常類型.Handle<Exception>()//也可以使用重載對Exception 進行再次過濾//.Handle<Exception>(e => e is NotSupportedException) .RetryForever((res, i, c) =>{//當委托的代碼塊執行失敗時會進入此 Action, //這里可以對拋出的異常進行日志或其他處理Console.WriteLine($"retry {i}th times, ex: {res.Exception?.Message}");}).Execute(() =>{var val = random.Next(0, 100);switch (val % 999){case 0:return $"Success, val: {val}";default:throw new Exception($"random val: {val}");}});Console.WriteLine(obj); }輸出:
將 case 0: 這個分支去掉, 任務將變為不可能成功,會發現一直輸出重試。
WaitAndRetry
程序異常后做短暫延遲再次重試:
.WaitAndRetry(5, // 設置 Sleep Duration Provider 來提供延遲時間retryTimes => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),(res, delay, times, context) =>{//當委托的代碼塊執行失敗時會進入此 Action, //這里可以對拋出的異常進行日志或其他處理Console.WriteLine($"retry {times}th times, sleep: {delay.TotalSeconds}s, ex: {res.Exception?.Message}");})可以看到我們在 WaitAndRetry 方法中提供了延遲方式: retryTimes => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),, 這是一種比較典型的延遲方式,叫做 指數退避。
輸出:
WaitAndRetryForever
.WaitAndRetryForever(// 設置 Sleep Duration Provider 來提供延遲時間(retryTimes, res, context) => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),(res, times, delay, context) =>{//當委托的代碼塊執行失敗時會進入此 Action, //這里可以對拋出的異常進行日志或其他處理Console.WriteLine($"retry {times}th times, sleep: {delay.TotalSeconds}s, ex: {res.Exception?.Message}");})僅僅與 WaitAndRetry 的 SleepDurationProvider 的參數有點不同
小結
此篇大體概括了 Polly 重試的幾種方式, 當然 Polly Retry 還有很多重載, 但作用都是圍繞 程序異常時進行自我調整再重試 為中心。
轉載于:https://www.cnblogs.com/rajesh/p/10773564.html
總結
以上是生活随笔為你收集整理的Polly 重试策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算数据管理的4个关键因素
- 下一篇: TensorFlow机器学习实战指南之第