zoukankan      html  css  js  c++  java
  • 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 type
    Policy
      .Handle<HttpRequestException>()
    
    // Single exception type with condition
    Policy
      .Handle<SqlException>(ex => ex.Number == 1205)
    
    // Multiple exception types
    Policy
      .Handle<HttpRequestException>()
      .Or<OperationCanceledException>()
    
    // Multiple exception types with condition
    Policy
      .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 once
    Policy
      .Handle<SomeExceptionType>()
      .Retry()
    
    // Retry multiple times
    Policy
      .Handle<SomeExceptionType>()
      .Retry(3)
    
    // Retry multiple times, calling an action on each retry 
    // with the current exception and retry count
    Policy
        .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 forever
    Policy
      .Handle<SomeExceptionType>()
      .RetryForever()
    
    // Retry forever, calling an action on each retry with the 
    // current exception
    Policy
      .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 duration
    Policy
      .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 seconds
    Policy
      .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

  • 相关阅读:
    找水王
    环状二维数组最大子数组和
    用户模板
    课堂作业-电梯调度
    书店折扣问题
    《软件工程》读后感
    首尾相连的二维数组最大子数组求和
    梦断代码读后感(二)
    返回一个整数数组中最大子数组的和之测试
    首尾相连的一位数组最大子数组和
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/13838554.html
Copyright © 2011-2022 走看看