Polly 和包装策略

Polly and wrapped policies

我是 Polly 的新手,正在尝试创建具有回退和超时策略的断路器。 我的设置如下所示,其中所有策略都是 "global",因此它们在调用之间保持状态:

_timeoutPolicy = 
Policy.Timeout(TimeSpan.FromMilliseconds(1500),TimeoutStrategy.Pessimistic);
_circuitBreaker = Policy.Handle<Exception>()
                  .AdvancedCircuitBreaker(
                           failureThreshold:0.5,
                           samplingDuration: TimeSpan.FromSeconds(20),
                           minimumThroughput: 5,
                           durationOfBreak: TimeSpan.FromSeconds(30)
                  );

_policy = Policy<ServiceResponse<T>>
    .Handle<Exception>()
    .Fallback(() => new ServiceResponse<T>()
    {
        IsValid = false,
        Message = "Tjänsten fungerar inte"
    }).Wrap(_circuitBreaker).Wrap(_timeoutPolicy);

稍后我使用 _policy 调用外部 webapi 作为:

_policy.Execute(() => SomeWebApiCallMethod<T>());

我想要实现的是,如果断路器策略与超时策略相结合,则激活回退响应...使用当前设置,它在第一轮工作,即在回退启动后的 20 秒内发生 5 个错误...我等了 30 秒,现在仅经过 1 次超过 1500 毫秒的尝试后,回退再次启动(?)但这是早期,因为断路器策略应该在回退启动之前在 20 秒内进行 5 次尝试......我会很高兴如果有人能指出我正确的方向如何解决这个问题。

谢谢!

初始答案(问题澄清后可能会更新)

回复:

I wait 30 sek and now after only 1 try that is over 1500 ms fallback kicks in again(?) but this is too early because circuit breaker policy should make 5 tries in 20 sec span before fallback kicks in

断路器在中断期后由于一次进一步的故障而再次断开,是设计的预期行为。断路器不是直接转换回关闭状态(并由为关闭状态定义的指标管理),而是在中断期后首先进入 'half-open' 状态,在该状态下,下一个单次调用被视为试调用以确定被调用系统的健康状况:如果单次试调用失败,则电路再次断开。 Detailed documentation here.

回复:

circuit breaker policy should make 5 tries in 20 sec span

断路器不会使尝试;他们 测量并允许 一组 number/ratio 破坏前的失败。如果您希望 Polly 策略也为您安排重试,请将 RetryPolicy 与断路器结合使用,如 described here.