熔断策略主要以 CircuitBreaker 来完成、

工作原理

熔断器可以被看作为一个主要含有三个状态的状态机

如果以电路开关来看:

开关闭合对应 CLOSED 状态, 开关打开对应 OPEN 状态, 而 HALF OPEN 只是为了过渡处理过程中的状态变化

  • OPEN 状态, FLOW 不通
  • CLOSED 状态, FLOW 正常

CLOSED

熔断器的初始状态就是 CLOSED, 当熔断器状态为 CLOSED 的时候:

  • 所有通过策略的操作将会被执行, 熔断器也会记录这些操作的失败与成功
  • 如果通过策略执行的操作失败数到达某个设置的阈值,熔断器将会被熔断,即状态变更为 OPEN 。
    • CircuitBreaker 会在 N 次连续的操作失败被熔断
    • AdvancedCircuitBreaker 的熔断取决于失败比率
  • 对于改变熔断器状态的操作,此操作产生的原始 exception 将会被抛出, 而熔断器的状态将会变更为 OPEN

OPEN

当熔断器状态为 OPEN 的时候:

  • 所有通过策略的操作都不会被执行
  • 调用方会立刻被返回 BrokenCircuitException 异常
    • BrokenCircuitException 将包含最后试熔断器状态改变操作抛出的异常作为 InnerException
  • 熔断器打开之后, 会持续 durationOfBreak 参数配置的时间。在此时间结束之后,当下一个经过策略的操作执行或者当 CircuitState 熔断器状态被查询的时候, 熔断器的状态会变更为 HALF OPEN。

HALF OPEN

当熔断器状态为 HALF OPEN 的时候:

  • 下一个经过策略的操作将会被视作测试,用来检查熔断器的健康状态

    • 如果该操作执行的时候已经超过了 durationOfBreak 设置的熔断时间,则执行操作。熔断器在每次熔断的期间内 durationOfBreak,只允许有一次尝试操作。所有其他在 HALF OPEN 状态的操作都会被拒绝执行,并抛出 BrokenCircuitException
  • 传入 Execute() (或类似重载) 的委托方法将被尝试调用
    • 如果调用抛出了已处理的异常, 原本的异常将会被再次抛出,并且熔断器的状态会立即变更为 OPEN,持续 durationOfBreak 配置的时间。
    • 如果此操作未抛出异常,则熔断器状态变更为 CLOSED

流程图

Circuit Breaker

public static void TryBasic()
{
var breaker = Policy
// 设置熔断器处理的异常类型
.Handle<Exception>() // 设置异常阈值 3 ,熔断持续时间 5.5 秒
.CircuitBreaker(3, TimeSpan.FromSeconds(5.5),
(e, state, tspan, context)=>
{
Console.WriteLine($"OnBreak: state: {state} \r\n ex: {e.Message}");
},
context =>
{
Console.WriteLine("onReset");
},
()=>
{
Console.WriteLine("onHalfOpen");
}); var random = new Random();
var obj = Policy<object>
.Handle<Exception>()
.WaitAndRetryForever(
(times, tspan) => TimeSpan.FromSeconds(1),
(res, times, tspan, c) =>
{
Console.WriteLine($"retry: {times}, breaker state: {breaker.CircuitState}");
}) // 组合重试与熔断策略
.Wrap(breaker) .Execute(() =>
{
var val = random.Next(1, 100);
Console.WriteLine($"called:{val}");
switch (val % 9)
{
case 0:
return "Success";
default:
throw new Exception($"error val: {val}");
}
}); Console.WriteLine(obj);
}

输出:

熔断器初始化状态为 CLOSED, 在产生三次异常之后,触发 OnBreak 回调, 状态也变更为了 OPEN,

在上面我们设置的熔断持续时间结束后,状态变更为了 HALF OPEN, 由重试策略执行了一次 Execute ,

called: 20

因为由引发了一次异常,导致 CircuitBreaker 再次熔断, 状态变更为 OPEN,与流程图一致。

AdvancedCircuitBreaker

public static void TryAdvanced()
{
var breaker = Policy
.Handle<Exception>() // 设置高级熔断器
.AdvancedCircuitBreaker( // 设置超过30%的失败率则熔断
failureThreshold: 0.8, // 10 秒做一次采样
samplingDuration: TimeSpan.FromSeconds(10), // 在采样时间内最小吞吐量
minimumThroughput: 5, // 熔断持续时间
durationOfBreak: TimeSpan.FromSeconds(10),
onBreak: (e, state, tspan, context) =>
{
Console.WriteLine($"OnBreak: state: {state} \r\n ex: {e.Message}");
},
onReset: context =>
{
Console.WriteLine("onReset");
},
onHalfOpen: () =>
{
Console.WriteLine("onHalfOpen");
}); var random = new Random();
var obj = Policy<object>
.Handle<Exception>()
.WaitAndRetryForever(
(times, tspan) => TimeSpan.FromSeconds(1),
(res, times, tspan, c) =>
{
Console.WriteLine($"retry: {times}, breaker state: {breaker.CircuitState}");
})
.Wrap(breaker)
.Execute(() =>
{
var val = random.Next(1, 100);
Console.WriteLine($"called:{val}");
switch (val % 9)
{
case 0:
return "Success";
default:
throw new Exception($"error val: {val}");
}
}); Console.WriteLine(obj);
}

输出:

将采样时间内 samplingDuration 异常次数除以设置最小吞吐量 minimumThroughput,得到失败率,若超过设置的 failureThreshold,则触发熔断。

注意

使用 Wrap 方法组合两个或 更多策略一起监控 Execute 中执行的操作。

Polly 熔断策略的更多相关文章

  1. 微服务之Polly熔断策略

    NET Core 微服务之Polly熔断策略 紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间 ...

  2. .NET Core 微服务之Polly熔断策略

    紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调 ...

  3. .NET Core 微服务之Polly重试策略

    接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细. 简单介绍一下绍轻量的故障处理库 Polly  Polly是一个.NET弹性和瞬态故障处理库 允许我们以非常 ...

  4. Polly 重试策略

    工作原理 Retry 基本重试: public static void Retry() { var random = new Random(); // Policy<> 泛型定义返回值类型 ...

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

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...

  6. ASP.NET Core 微服务初探[2]:熔断降级之Polly

    当我们从单体架构迁移到微服务模式时,其中一个比较大的变化就是模块(业务,服务等)间的调用方式.在以前,一个业务流程的执行在一个进程中就完成了,但是在微服务模式下可能会分散到2到10个,甚至更多的机器( ...

  7. (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  8. (5).NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  9. 熔断降级(Polly)

    熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务 ...

随机推荐

  1. oracle两种分页查询

    第一种: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM table_name) A ) ; 第二种: SELECT * FROM ( ...

  2. C# 图片识别

    项目需要识别图片上的信息,网上搜索试了Asprise-OCR.Microsoft Office Document Imaging(Office 2007) 组件实现两种方式,后者可以识别中文等其他语言 ...

  3. H3C设备系列问题

    一.h3c交换器和交换机的Telnet或SSH登录用户名和密码忘记了,怎么办? 处理步骤: 1.使用Console线连接交换机或路由器的Console口,确保笔记本已连上设备,在设备启动过程中根据提示 ...

  4. 【git】强制覆盖本地代码(与git远程仓库保持一致)

    git强制覆盖:    git fetch --all    git reset --hard origin/master    git pull git强制覆盖本地命令(单条执行):    git ...

  5. Android Studio旧版(内含SDK)安装和环境变量配置 转自I-T枭

    win10下Android Studio和SDK下载.安装和环境变量配置 ------made by siwuxie095 转自I-T枭https://me.csdn.net/hahahhahahah ...

  6. Hydra(爆破神器)

    PS:这款暴力密码破解工具相当强大,支持几乎所有协议的在线密码破解,其密码能否被破解关键在于字典是否足够强大.对于社会工程型渗透来说,有时能够得到事半功倍的效果.本文仅从安全角度去探讨测试,使用本文内 ...

  7. 主线程 RunLoop 学习笔记

    以下为主RunLoop 的输出,能够看到不同的source0,source1,observer ---------------------------------- CFRunLoop{wakeup ...

  8. android 开发设计模式---Strategy模式

    假设我们要出去旅游,而去旅游出行的方式有很多,有步行,有坐火车,有坐飞机等等.而如果不使用任何模式,我们的代码可能就是这样子的. 12345678910111213141516171819202122 ...

  9. poj3373--Changing Digits(DFS+剪枝///记忆化)

    题目链接:点击打开链接 题目大意:给出一个n和一个k 求m 要求1.m要和n相同的位数 要求2.m要整除k 要求3.如果1和2满足,那么m要和n有尽量少的不同位 要求4.如果1.2.3满足,要使m尽量 ...

  10. 【Access】数据库四门功课--[增删改查]基础篇

    一.增 以userinfo为例 1.增加一条完整的数据 INSERT INTO userinfo VALUES (1, 2, 3, 4); 基本格式:INSERT INTO AAA VALUES (X ...