.NET Core 微服务之Polly熔断策略
紧接着上一篇说,咱们继续介绍Polly这个类库
熔断策略(Circuit-breaker)#
如果调用某个目标服务出现过多超时、异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调用目标服务,而是直接返回,节约资源,提高服务的稳定性,熔断周期结束后如果目标服务情况好转则恢复调用。
注意:为了服务的稳定性,在执行需要多次 Retry重试策略的情况下( 重试策略,感兴趣的小伙伴可以查看我上一篇,或者自行搜索),最好组合熔断策略,预防可能存在的风险。
熔断状态#
- 打开(Open)
熔断器打开状态,此时对目标服务的调用都直接返回错误,熔断周期内不会走网络请求,当熔断周期结束时进入半开状态;
- 关闭(Closed)
关闭状态下正常发生网络请求,但会记录符合熔断条件的连续执行次数,如果错误数量达到设定的阈值(如果在没有达到阈值之前恢复正常,之前的累积次数将会归零),熔断状态进入到打开状态;
- 半开(Half-Open)
半开状态下允许定量的服务请求,如果调用都成功(或一定比例)则认为恢复了,关闭熔断器,否则认为还没好,又回到熔断器打开状态;
熔断使用说明#
// 在连续3次异常后熔断,并保持1分钟的熔断状态,调用者将收到断路保护的异常信息 Policy .Handle<SomeExceptionType>() .CircuitBreaker(3, TimeSpan.FromMinutes(1));
熔断代码测试#
private static int times = 0; public static void TestPolicy() { var circuitBreakerPolicy = Policy .Handle<Exception>() .CircuitBreaker( exceptionsAllowedBeforeBreaking: 4, // 连续4次异常 durationOfBreak: TimeSpan.FromMinutes(1), // 断开1分钟 onBreak: (exception, breakDelay) => // 断路器打开时 Console.WriteLine($"熔断: {breakDelay.TotalMilliseconds } ms, 异常: " + exception.Message), onReset: () => // 熔断器关闭时 Console.WriteLine("熔断器关闭了"), onHalfOpen: () => // 熔断时间结束时,从断开状态进入半开状态 Console.WriteLine("熔断时间到,进入半开状态") ); for (int i = 0; i < 12; i++) // 模拟多次调用,触发熔断 { try { var result = circuitBreakerPolicy.Execute(Test); Console.WriteLine(result); } catch (Exception ex) { Console.WriteLine("try-catch:" + ex.Message); } Thread.Sleep(500); } } private static string Test() { times++; if (times % 5 != 0) // 模仿某些错误情况下抛异常 { throw new Exception("exception message"); } return "success"; }
熔断高级配置#
根据时间段内总请求数中的异常比例触发熔断:
var advancedCircuitBreakerPolicy = Policy .Handle<Exception>() .AdvancedCircuitBreaker( failureThreshold: 0.5, // 至少50%有异常则熔断 samplingDuration: TimeSpan.FromSeconds(10), // 10秒内 minimumThroughput: 8, // 最少共有多少次调用 durationOfBreak: TimeSpan.FromSeconds(30), onBreak: (exception, breakDelay) => // 断路器打开时 Console.WriteLine($"熔断: {breakDelay.TotalMilliseconds } ms, 异常: " + exception.Message), onReset: () => // 熔断器关闭时 Console.WriteLine("熔断器关闭了"), onHalfOpen: () => // 熔断时间结束时,从断开状态进入半开状态 Console.WriteLine("熔断时间到,进入半开状态") );
可以看到使用起来还是 挺方便简单的,可以结合项目框架组合出不同玩法,哈哈哈,感兴趣的同学可以自行古哥或者度娘哈。回见
作者:DanielYao
出处:https://www.cnblogs.com/DanielYao/p/11091297.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎大家关注我的微信公众号,新文章会优先发到公众号!
本文来自博客园,作者:打滚的姚先森,转载请注明原文链接:https://www.cnblogs.com/DanielYao/p/11091297.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异