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


    1. 重试(Retry)

    1. Policy
    2. .Handle() //指定需要重试的异常类型
    3. .Retry(2,(ex,count,context)=> { //指定发生异常重试的次数
    4. Console.WriteLine($ "重试次数{count},异常{ex.Message}" );
    5. })
    6. .Execute(() => Console.Write( "execute method!" )); //指定执行的方法
    1. const int retryTimes = 2;//重连次数
    2. static RetryPolicy policy = Policy.Handle().WaitAndRetry(retryTimes, retryAttempt => TimeSpan.FromSeconds(Math.Pow(0, retryAttempt)));

    重试策略的使用步骤:

    • 指定需要处理的异常
    • 指定重试次数和监控重试
    • 指定执行的任务

    2. 超时(Timeout)

    1. Policy
    2. .Timeout(10, (context, timeSpan, task) =>
    3. {
    4. Console.WriteLine("1");
    5. });

    3. 熔断(Circuit-breaker)

    在执行某个任务时,多次重试依然出现超时或则异常,且重试的次数已经超过了系统设定上限。此时中断当前的执行,快速响应失败信息给用户,等待一段时间再进行恢复,继续执行。

    1. var breakerPlocy = Policy.Handle() //指定异常类型
    2. .CircuitBreaker(5, TimeSpan.FromSeconds(30), //设置5次阀值,中断30秒
    3. onBreak: (ex, timeSpan) => { Console.WriteLine( "onBreak" ); }, //中断回调
    4. onReset: () => { Console.WriteLine( "onReset" ); }); //重置回调
    1. Policy.Handle()
    2. .CircuitBreaker(2, TimeSpan.FromMinutes(1));
    3. //当系统出现2次某个异常后,停止重试,等待1min后重试

     

    4. 回退(Fallback)

    当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,即备用方案。

    1. Policy
    2. .Handle()
    3. .Fallback(fallbackAction: () => { }, onFallback: (ex) => { });
    1. Policy.Handle()
    2. .Fallback(() => UserAvatar.GetRandomAvatar())

     

    5. 隔板隔离策略

    当进程出现故障,多次失败,并一直占用主机的资源, 此时用隔离板隔离有互相影响的操作,将受管制的资源 限制在一个固定的资源池中。

    1. Policy.Bulkhead(10, (context) => { });
    2. //指定最大的线程数,,若执行被拒绝,则执行回调

    6.缓存策略

    当 数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来。

    1. ISyncCacheProvider cacheProvider = new StubCacheProvider();
    2. Funcstring > cacheKeyStrategy = null ;
    3. Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy);
    1. var memoryCacheProvider = new MemoryCacheProvider(myMemoryCache);
    2. var cachePolicy = Policy.Cache(memoryCacheProvider, TimeSpan.FromMinutes(5));
    3. TResult result = cachePolicy.Execute(context => getFoo(), new Context("FooKey"));

     

    7. 策略包装策略

    不同的异常需要不同的策略,弹性的使用策略来应对不同的异常信息。

    1. NoOpPolicy policy0 = Policy.NoOp();
    2. NoOpPolicy policy1 = Policy.NoOp();
    3. NoOpPolicy policy2 = Policy.NoOp();
    4. PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);
    1. var policyWrap = Policy
    2. .Wrap(fallback, cache, retry, breaker, timeout, bulkhead);
    3. policyWrap.Execute(...);

     

  • 相关阅读:
    通过java agent监控程序执行
    创客教育给教师发展带来的挑战
    python的破解重构加密
    iOS小技能:适配安全区域高度
    多卡片效果悬停效果
    python学习笔记1-SortedList的使用
    一个中东外贸业务员分享的干货
    FFmpeg解复用器(解封装)简单测试【2】
    SpringBoot轻松解决Excel导入导出功能
    轻量级模型NanoDet基于自己的数据集【接打电话检测】从零构建模型超详细教程
  • 原文地址:https://blog.csdn.net/m0_54035969/article/details/134267607