背景
Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达诸如重试,断路器,超时,隔离头和回退之类的策略。
Polly面向.NET Standard 1.1(覆盖范围:.NET Core 1.0,Mono,Xamarin,UWP,WP8.1 +)和.NET Standard 2.0+(覆盖范围:.NET Core 2.0 + 、. NET Core 3.0和更高版本的Mono,Xamarin和UWP目标)。nuget软件包还包括.NET Framework 4.6.1和4.7.2的直接目标。.
使用方式
通过NuGet安装
Install-Package Polly代码实现
故障处理,响应策略
故障处理策略处理您通过策略执行的委托引发的特定异常或 返回的结果。
步骤1:指定您希望策略处理的异常/错误
// Single exception typePolicy.Handle<HttpRequestException>()// Single exception type with conditionPolicy.Handle<SqlException>(ex => ex.Number == 1205)// Multiple exception typesPolicy.Handle<HttpRequestException>().Or<OperationCanceledException>()// Multiple exception types with conditionPolicy.Handle<SqlException>(ex => ex.Number == 1205).Or<ArgumentException>(ex => ex.ParamName == "example")// Inner exceptions of ordinary exceptions or AggregateException, with or without conditions// (HandleInner matches exceptions at both the top-level and inner exceptions)Policy.HandleInner<HttpRequestException>().OrInner<OperationCanceledException>(ex => ex.CancellationToken != myToken)
步骤2:指定策略应如何处理这些故障
2.1、重试
// Retry oncePolicy.Handle<SomeExceptionType>().Retry()// Retry multiple timesPolicy.Handle<SomeExceptionType>().Retry(3)// Retry multiple times, calling an action on each retry// with the current exception and retry countPolicy.Handle<SomeExceptionType>().Retry(3, onRetry: (exception, retryCount) =>{// Add logic to be executed before each retry, such as logging});// Retry multiple times, calling an action on each retry// with the current exception, retry count and context// provided to Execute()Policy.Handle<SomeExceptionType>().Retry(3, onRetry: (exception, retryCount, context) =>{// Add logic to be executed before each retry, such as logging});
2.2、永远重试(直到成功)
// Retry foreverPolicy.Handle<SomeExceptionType>().RetryForever()// Retry forever, calling an action on each retry with the// current exceptionPolicy.Handle<SomeExceptionType>().RetryForever(onRetry: exception =>{// Add logic to be executed before each retry, such as logging});// Retry forever, calling an action on each retry with the// current exception and context provided to Execute()Policy.Handle<SomeExceptionType>().RetryForever(onRetry: (exception, context) =>{// Add logic to be executed before each retry, such as logging});
2.3、等待并重试
// Retry, waiting a specified duration between each retry.// (The wait is imposed on catching the failure, before making the next try.)Policy.Handle<SomeExceptionType>().WaitAndRetry(new[]{TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2),TimeSpan.FromSeconds(3)});// Retry, waiting a specified duration between each retry,// calling an action on each retry with the current exception// and durationPolicy.Handle<SomeExceptionType>().WaitAndRetry(new[]{TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2),TimeSpan.FromSeconds(3)}, (exception, timeSpan) => {// Add logic to be executed before each retry, such as logging});// Retry, waiting a specified duration between each retry,// calling an action on each retry with the current exception,// duration and context provided to Execute()Policy.Handle<SomeExceptionType>().WaitAndRetry(new[]{TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2),TimeSpan.FromSeconds(3)}, (exception, timeSpan, context) => {// Add logic to be executed before each retry, such as logging});// Retry, waiting a specified duration between each retry,// calling an action on each retry with the current exception,// duration, retry count, and context provided to Execute()Policy.Handle<SomeExceptionType>().WaitAndRetry(new[]{TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2),TimeSpan.FromSeconds(3)}, (exception, timeSpan, retryCount, context) => {// Add logic to be executed before each retry, such as logging});// Retry a specified number of times, using a function to// calculate the duration to wait between retries based on// the current retry attempt (allows for exponential backoff)// In this case will wait for// 2 ^ 1 = 2 seconds then// 2 ^ 2 = 4 seconds then// 2 ^ 3 = 8 seconds then// 2 ^ 4 = 16 seconds then// 2 ^ 5 = 32 secondsPolicy.Handle<SomeExceptionType>().WaitAndRetry(5, retryAttempt =>TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));// Retry a specified number of times, using a function to// calculate the duration to wait between retries based on// the current retry attempt, calling an action on each retry// with the current exception, duration and context provided// to Execute()Policy.Handle<SomeExceptionType>().WaitAndRetry(5,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),(exception, timeSpan, context) => {// Add logic to be executed before each retry, such as logging});// Retry a specified number of times, using a function to// calculate the duration to wait between retries based on// the current retry attempt, calling an action on each retry// with the current exception, duration, retry count, and context// provided to Execute()Policy.Handle<SomeExceptionType>().WaitAndRetry(5,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),(exception, timeSpan, retryCount, context) => {// Add logic to be executed before each retry, such as logging});
开源地址
https://github.com/App-vNext/Polly