ASP VNext 开源服务容错处理库Polly

背景

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