Polly-高级断路器

The original CircuitBreaker

最初的Polly断路器根据连续抛出的异常数量作为触发断路的条件。这在许多场景中都非常有效,易于理解和配置。多数情况下先这么使用没什么问题。

然而,在某些情况下,具有更详细配置参数的断路器可能是有用的。特别是在高吞吐量(和可变吞吐量)场景中,故障比例可能比连续计数更能反映服务的健康状况,而连续计数可能随负载一直变动。

The AdvancedCircuitBreaker (v4.2)

高级断路器 AdvancedCircuitBreaker 提供了如下功能:

  • 根据故障占比作出响应,可配置值 failureThreshold;;例如,如果超过50%的d调用失败,则中断
  • 滑动计算失败比例,取样时间区间samplingDuration,因此,旧的失败就会被排除,对现在没有影响
  • 在生效之前施加一个“最小吞吐量”minimumThroughput,这样电路只有在流量较大是才做出反应,而不会在流量较小时断路

ps:翻译的不好,实在不明白的看下代码中的注释

             Builds a Polly.Policy that will function like a Circuit Breaker.
             The circuit will break if, within any timeslice of duration samplingDuration,
             the proportion of actions resulting in a handled exception exceeds failureThreshold,
             provided also that the number of actions through the circuit in the timeslice
             is at least minimumThroughput.
             The circuit will stay broken for the durationOfBreak. Any attempt to execute
             this policy while the circuit is broken, will immediately throw a Polly.CircuitBreaker.BrokenCircuitException
             containing the exception that broke the circuit.
             If the first action after the break duration period results in a handled exception,
             the circuit will break again for another durationOfBreak; if no exception is
             thrown, the circuit will reset.

Syntax

Policy
   .Handle<Whatever>(...)
   .AdvancedCircuitBreaker(
        double failureThreshold, 
        TimeSpan samplingDuration, 
        int minimumThroughput, 
        TimeSpan durationOfBreak)

上面是同步的示例;异步操作也存在类似的重载。请参阅readmewiki了解更多细节

Definition

failureThreshold(失败阈值)

failureThreshold: 断路器断路的阈值。0和1之间的小数。例如,0.5表示超过50%的调用失败会触发断路器断路。

samplingDuration

samplingDuration: 断路器考虑在此期间的调用失败率。在此时间段之前发生的调用不在断路器的考虑范围。

minimumThroughput

minimumThroughput: 在samplingDuration时间内调用达到此阈值,电路才会考虑断路。

推荐配置

用于控制下游系统的RESTful调用的初始配置可能是:

Policy
   .Handle<TException>(...)
   .AdvancedCircuitBreaker(
        failureThreshold: 0.5,
        samplingDuration: TimeSpan.FromSeconds(5),
        minimumThroughput: 20, 
        durationOfBreak: TimeSpan.FromSeconds(30))

... 如果你想让你的电路在最多10秒内对一个有故障的子系统做出响应(见下面的[讨论](https://github.com/App-vNext/Polly/wiki/Advanced-Circuit-Breaker detailed-operation-of-failure-statistics)),假设你的调用量满足了最小流量,并且你想让断路器中断30s.(PS:没看懂啥意思呀,括号前后有关联?)

你只有根据你系统的性能情况逐步调整断路器配置。利用配置文件动态调整配置也是个不错的策略,时刻监控配置文件的变化,并根据最新的配置文件替换掉正在运行的断路器。这样的话你就不必重新编译或发布程序了。

断路器参数的值需要考虑很多因素,不仅仅是当前管理的系统,还要考虑断路器断路后的故障转移等。

以下几点也需要注意:

错误阈值

  • 初始阈值设置在0.5到0.7之间的比较适合作为调优的初始值

  • 比较高的阈值如0.9(大于或等于90%的失败则断路)可能让你的断路器难以断路。 当你的系统已经达到90%的失败率的时候,你把阈值设置到100%,你提给消费者的只是更多的等待时间,并没有其他好处。在您通过中断电路和更快地失败来帮助他们之前,许多调用者将失败(并在缓慢的超时)。在断路器断路之前许多调用仍然会失败。

  • 较低值如0.1(在10%或以上故障时断开)或0.2会导致你的电路“容易触发”,断路器过早断路。这可能会让另外90%用户收到失败的惩罚(以为此时断路器断开,后续请求无法继续调用)。

因此,如前所述,适当的设置将取决于你的系统的特征,以及在此电路中断时后备或故障转移替代方案的性质。

samplingDuration

samplingDuration是统计数据被测量的持续时间;任何超过这个时期的统计数据都会被遗忘。

  • 请记住,这将转化为系统应对故障的响应速度。对于响应式系统,应该以秒数来配置,而不是分钟或者小时。

要理解这一点,请考虑成功的“长尾”会如何影响统计数据。考虑一个具有合理吞吐量的调用电路,配置采样时间为5分钟,并设置在50%故障阈值时断开。假设断路器托管的行为一开始是100%执行成功了5分钟,然后100%失败。这样断路器要在经过2.5分钟才能达到50%失败的阈值,从而“消除”100%成功时代的统计数据。概括地说,一个采样时间为_T_的电路,其故障与跳闸的比率为_r_,在其他条件相同的情况下,从最佳情况(100%成功)到最坏情况(100%失败)的反应需要_T * r_时间(5m*0.5=2.5m)。虽然现实世界可能不会像这样有规律,但电路响应性仍然以这种方式与samplingDuration大致成比例。

  • samplingDuration允许的最小值是20毫秒,这是断路计时器的最小分辨率。

Minimum throughput(最小流量)

设置一个值以保持统计数据有意义,如果需要的话,可以避免“低流量”时期的断路。

  • 请记住,这个值应该被认为是一个最小值,而不是接近电路的典型吞吐量。如果该值实际上太接近电路的典型吞吐量,电路可能会花费大量时间等待满足最小吞吐量阈值,因此不会像您希望或期望的那样经常断路。

  • 在刻度的低端,请记住minimumThroughput将如何转化为断路器故障统计的最小分辨率。较低的minimumThroughput将导致统计数据的初始分辨率较粗糙(粒度较粗)。例如,“最小吞吐量”值为2(允许的最低值)将意味着电路的最小/初始分辨率将设置为0%、50%、100%的值,此时failureThreshold能配置为0,0.5,1,这样粒度就太粗了,没有意义。

故障统计的详细操作

在断路器内部,断路器通过滚动统计窗口进行统计。将配置的samplingDuration _T_分成10个切片,每次_T/10_时,丢弃周期_T_的10%的统计信息。这样可以将错误率的计算平滑到可接受的公差(与每次处理100%的统计数据相比)。

如果samplingDuration被设置为低于200毫秒,samplingDuration将不会被进一步细分为片。这可以防止响应很少变动的情况下过度频繁地重新计算(200ms/10=20ms,少于20ms的调用肯定很少)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值