.NET熔断之Polly

1.

Net Core 中有一个被.Net 基金会认可的库 Polly,可以用来简化熔断降级的处理。主要功能:重试(Retry);断路器(Circuit-breaker);超时检测(Timeout);缓存(Cache);降级(FallBack);

官网:https://github.com/App-vNext/Polly

介绍文章:https://www.cnblogs.com/CreateMyself/p/7589397.html

Nuget安装指令:Install-Package Polly -Version 6.0.1

using System.Threading;
using System.Threading.Tasks;
using Daocfg;
using Daocfg.Models.Account;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Exceptions;
using Polly;
using Polly.CircuitBreaker;
using Polly.Timeout;

class PolicyTest
    {
        /// <summary>
        /// mapper
        /// </summary>
        private static readonly ISqlMapper mapper;

        private static readonly Dictionary<int, string> SqlErrorNumbers = new Dictionary<int, string>
            {
                { -2, "超时时间已到。 超时时间在操作完成或服务器没有响应之前已过。" },
                { -1, "在建立与服务器的连接时出错。  服务器不支持请求的协议 " },
                { 2, "在建立与服务器的连接时出错。无法打开到 SQL Server 的连接" },
                { 53, "在建立与服务器的连接时出错。无法打开到 SQL Server 的连接"  },
            };

        //触发熔断的连续错误阈值
        private static readonly int ExceptionsAllowedBeforeBreaking = 3;
        //熔断的时间窗口
        private static readonly int DurationOfBreak = 5;

        private static readonly Policy PolicyInstance;
        static PolicyTest()
        {
            mapper = NewSqlMapper.Instance();
            Policy mainPolicy = Policy.Handle<TimeoutException>()
                    .Or<TimeoutRejectedException>(ex => true)
                    .Or<WebException>(ex => ex.Status == WebExceptionStatus.Timeout)
                    .Or<SqlException>(ex => SqlErrorNumbers.Keys.Contains(ex.Number))
                    .Or<DataMapperException>(ex => ex.Message.StartsWith("Unable to open connection", StringComparison.OrdinalIgnoreCase))
                    .CircuitBreaker(ExceptionsAllowedBeforeBreaking, TimeSpan.FromSeconds(DurationOfBreak), (exception, span,
                        arg3) =>
                    {

                    }, (context) =>
                    {

                    });
            Policy policytimeout = Policy.Timeout(1, TimeoutStrategy.Pessimistic);
            PolicyInstance = mainPolicy.Wrap(policytimeout);
        }

        public static void Excute()
        {
            for (int i = 1; i <= 20; i++)
            {
                Console.WriteLine("当前为第" + i.ToString() + "次请求...");
                try
                {
                    PolicyInstance.Execute(() =>
                    {
                        Console.WriteLine("开始任务!");
                        Thread.Sleep(1100);
                        var list = mapper.QueryForList<AccountDao>("qryAccount", new AccountFilter()
                        {
                            CustomerId = 1357,
                        });
                        Console.WriteLine("完成任务!帐号信息:" + String.Join(",", list));
                    });
                }
                catch (BrokenCircuitException ex)
                {
                    Console.Write("触发熔断!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("execute出错" + ex.GetType().FullName);
                }

                Thread.Sleep(100);
            }
        }
    }

原文地址:https://www.cnblogs.com/zhshlimi/p/10283710.html

时间: 2024-08-30 09:57:07

.NET熔断之Polly的相关文章

Net的微服务选型之路

因为公司规划原因,需要做一套集团化的数据平台,而且我们数据量还不小,单一个分公司主业务表单表一年多点已经快4kw,还不算从表和结果记录表等.目前微服务项目这么热,而且整个团队基本都是在NET环境下的码工,之前也用Net core做了一些小的项目.所以我们也准备在大项目中实践微服务.同时也是想跟大家分享一下我的想法,看了一些文章,对一个大型项目一开始就上手微服务还是信心不足的,而且还有很多的坑等着我们去踩.所以文章内容不当之处请各位看官多多包涵,不喜勿喷,欢迎指正. 为了避免重复造轮子,其实也是人

Polly+AspectCore实现熔断与降级机制

Polly+AspectCore实现熔断与降级机制 https://www.cnblogs.com/edisonchou/p/9159644.html 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度规定区间限制,一旦成交价触及区间上下限,交易则自动中断一段时间("熔即断"),或就此"躺平"而不得超过上限或下限("熔而不断"). 而对于微服务来说,熔断就是我

熔断降级(Polly)

熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成"雪崩",或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发生故障的时候,向调用方返回一个错误响应或者替代响应.举例子:调用联通接口服务器发送短信失败之后,改用移动短信服务器发送,如果移动短信服务器也失败,则改用电信短

.NET Core微服务之基于Polly+AspectCore实现熔断与降级机制

一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度规定区间限制,一旦成交价触及区间上下限,交易则自动中断一段时间("熔即断"),或就此"躺平"而不得超过上限或下限("熔而不断"). 而对于微服务来说,熔断就是我们常说的"保险丝",意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的"雪崩&q

微服务之Polly熔断策略

紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调用目标服务,而是直接返回,节约资源,提高服务的稳定性,熔断周期结束后如果目标服务情况好转则恢复调用. 注意:为了服务的稳定性,在执行需要多次 Retry重试策略的情况下( 重试策略,感兴趣的小伙伴可以查看我上一篇,或者自行搜索),最好组合熔断策略,预防可能存在的风险. 熔断状态 打开(Open) 熔

ASP.NET Core-HttpClientFactory + Polly 实现熔断降级【转】

本文主要介绍 HttpClientFactory 整合 Polly 的使用,实现对 Http 请求的超时.重试.熔断.降级等操作. HttpClientFactory 集成 Polly 创建 .NET Core API 项目(这里使用的是 .NET Core 2.2): 安装 Microsoft.Extensions.Http.Polly NuGet Package; 在 Startup.cs 的 ConfigureServices 方法中添加 HttpClient 相关代码: public v

polly异常重试、熔断

Polly:可以用来简化熔断降级的处理.主要功能:出现异常后,重试 断路器 超时检测 缓存 失败处理 熔断降级:防止一个服务请求失败导致整个系统崩溃,熔断后就不去请求此服务,快速失败 断路保护:连续出现N次异常,熔断几秒,等待的这段时间会抛出BrokenCircuitException异常.等待时间结束再执行Excute的时候如果又错了(一次就够),那么继续熔断一段时间,否则回复正常.熔断的目的是避免服务不可用了还是使劲请求给系统造成更大压力 //处理ArgumentException,Null

Polly 熔断策略

熔断策略主要以 CircuitBreaker 来完成. 工作原理 熔断器可以被看作为一个主要含有三个状态的状态机 如果以电路开关来看: 开关闭合对应 CLOSED 状态, 开关打开对应 OPEN 状态, 而 HALF OPEN 只是为了过渡处理过程中的状态变化 OPEN 状态, FLOW 不通 CLOSED 状态, FLOW 正常 CLOSED 熔断器的初始状态就是 CLOSED, 当熔断器状态为 CLOSED 的时候: 所有通过策略的操作将会被执行, 熔断器也会记录这些操作的失败与成功 如果通

Polly

再探Circuit Breaker之使用Polly Polly http://www.cnblogs.com/catcher1994/p/9032531.html 不废话了,直接进正题. 简单的例子 同样先定义一个简单的服务. [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public string Get() { return &