微服务之Polly熔断策略
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("熔断时间到,进入半开状态")
);

可以看到使用起来还是 挺方便简单的,可以结合项目框架组合出不同玩法,哈哈哈,感兴趣的同学可以自行古哥或者度娘哈。回见
微服务之Polly熔断策略的更多相关文章
- .NET Core 微服务之Polly熔断策略
紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调 ...
- .NET Core 微服务之Polly重试策略
接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细. 简单介绍一下绍轻量的故障处理库 Polly Polly是一个.NET弹性和瞬态故障处理库 允许我们以非常 ...
- Spring Cloud微服务如何实现熔断降级?
熔断限流概述 在基于Spring Cloud的微服务架构体系下,按照系统功能边界的不同划分,原先大而全的系统会被拆分为多个不同的微服务,而相应的微服务会提供一组功能关联的服务接口,并向系统中的其他微服 ...
- Polly 熔断策略
熔断策略主要以 CircuitBreaker 来完成. 工作原理 熔断器可以被看作为一个主要含有三个状态的状态机 如果以电路开关来看: 开关闭合对应 CLOSED 状态, 开关打开对应 OPEN 状态 ...
- 三分钟学会.NET微服务之Polly
熔断降级是一个非常重要的概念,我们先说一下什么是熔断降级,咱们都知道服务发现,一个有问题的服务器没来得急注销过一会就崩溃掉了,那么我们的请求就有可能访问一个已经崩溃的服务器,那么就会请求失败,因为已经 ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- 微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...
- .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...
- ASP.NET Core 微服务初探[2]:熔断降级之Polly
当我们从单体架构迁移到微服务模式时,其中一个比较大的变化就是模块(业务,服务等)间的调用方式.在以前,一个业务流程的执行在一个进程中就完成了,但是在微服务模式下可能会分散到2到10个,甚至更多的机器( ...
随机推荐
- How to Set Up a NFS Server on Debian 10 Buster
How to Set Up a NFS Server on Debian 10 Buster Nick Congleton Debian 24 May 2019 Contents 1. Softw ...
- Elasticsearch 调优之 写入速度优化到极限
基于版本: 2.x – 5.x 在 es 的默认设置,是综合考虑数据可靠性,搜索实时性,写入速度等因素的,当你离开默认设置,追求极致的写入速度时,很多是以牺牲可靠性和搜索实时性为代价的.有时候,业 ...
- ROS手动编写消息发布器和订阅器topic demo(C++)
1.首先创建 package cd ~/catkin_ws/src catkin_create_pkg topic_demo roscpp rospy std_msgs 2. 编写 msg 文件 cd ...
- 做reacat小项目的过程(我感觉适合那种刚刚接触react感觉很深奥的亲们,通过这个可以建立一个很垃圾的项目,入门吧,往深处就需要自己再看了)
需求:做一个react框架的前端框架(包括路由,请求后端等),大概就是做一个左边导航右边显示组件页面的东西,ui为material-ui 环境: 软件:vscode 包含的知识点:使用路由来导航,使用 ...
- WPF_AutoCompleteBox智能提示_Xml读写
效果图 1.需要引用的DLL 2. Window.xaml <Window x:Class="自己的命名空间" xmlns="http://schemas.micr ...
- 2019-12-11:kali linux工具Msfvenom 命令自动补全
msfvenom大家都不陌生,在我们使用MSF进行权限维持,内网渗透的时候都会用到,支持的语言的种类很多.大家都知道我们在使用msfvenom 的时候需要手动输入很多参数,这些参数需要记忆,或记在其它 ...
- C++删除字符串的前后空格
函数: string trim(string& str) { str.erase(0, str.find_first_not_of(" \t")); // 去掉头部空格 s ...
- Java核心复习——synchronized
一.概念 利用锁机制实现线程同步,synchronized关键字的底层交由了JVM通过C++来实现 Java中的锁有两大特性: 互斥性 同一时间,只允许一个线程持有某个对象锁. 可见性 锁释放前,线程 ...
- 2018-2019-2 《网络对抗技术》Exp8 Web基础 Week11-12 20165233
Exp8 Web基础 目录 一.基础问题 二.实验步骤 实验点一:Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. 实验 ...
- Ajax 是什么? 如何创建一个Ajax?
ajax的全称:Asynchronous Javascript And XML. 异步传输+js+xml. 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他 ...