Polly和包装政策

时间:2017-07-10 22:06:40

标签: circuit-breaker polly

我是Polly的新手,正在尝试创建一个具有后备和超时策略的断路器。 我的设置如下所示,所有策略都是“全局”的,因此它们在调用之间保持状态:

_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 sek和现在只有1次尝试超过1500毫秒后退再次开始(?)但是这是为了早,因为断路器政策应该在20秒范围内进行5次尝试,然后回退开始...我会很高兴,如果有人可以指出我正确的方向如何解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

INITIAL ANSWER (问题澄清后可能会更新)

回复:

  

我等待30 sek,现在只有1次尝试超过1500 ms后退再次开始(?)但是这太早了,因为断路器策略应该在20秒范围内进行5次尝试,然后才能进行后退

由于断开期后的单一进一步故障,断路器再次断开,是设计的预期行为。在断开期之后,断路器首先进入“半开”状态,而下一次呼叫被视为一个“半开”状态,而不是直接转换回闭状态(并由关闭状态定义的指标控制)。试用来确定被叫系统的健康状况:如果单次试用呼叫失败,电路会再次中断。 Detailed documentation here

回复:

  

断路器策略应在20秒范围内进行5次尝试

断路器不进行尝试;他们在破坏之前测量并允许设定的数量/故障比率。如果您希望Polly政策也为您协调重试,请将RetryPolicy与断路器合并为described here