0

我是 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 次尝试,然后回退开始......如果有人能指出我,我会很高兴在正确的方向如何解决这个问题。

谢谢!

4

1 回答 1

0

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

回覆:

我等了 30 sek,现在只有 1 次超过 1500 毫秒的回退再次启动(?)但这还为时过早,因为断路器策略应该在回退开始之前的 20 秒跨度内进行 5 次尝试

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

回覆:

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

断路器不尝试;他们在破坏之前测量并允许设定的故障数量/比率。如果您希望 Polly 策略也为您安排重试,请结合 a RetryPolicywith 断路器,如此处所述

于 2017-07-10T22:39:52.940 回答