在Polly CircuitBreaker中设置durationBreak

时间:2018-12-08 14:52:27

标签: c# polly

我将Polly Circuit Breaker用于API,如果维修服务中断,则会引发用户定义的异常。 异常将包含一个值,指示服务将关闭多长时间。

在处理了第一个用户异常之后是否可以配置/更新断路器策略?

例如

CircuitBreakerPolicy breaker = Policy.Handle<UserException>()
.CircuitBreaker(
exceptionsAllowedBeforeBreaking: 1, 
durationOfBreak: TimeSpan.FromMinutes(1));

Example()
{
    try
    {

        string response = await breaker.ExecuteAsync<String>(() =>
        {
            return client.GetStringAsync("/api/values/");
        });
    }
    catch (UserException ex)
    {
        var downtime = GetDowntime(ex);

        //how to update the duration of break ?
        breaker.durationOfBreak = downtime;
    }
    catch (Exception ex)
    {
        …
    }
}

1 个答案:

答案 0 :(得分:0)

创建后,无法在现有durationOfBreak实例上更改CircuitBreakerPolicy

对于运行期间 general 的动态重新配置,Polly团队建议使用atomically updating a policy instance stored in the PolicyRegistry

对于特定情况:

  

[the] API会抛出用户定义的异常,如果服务因维护而中断[该值将包含服务将中断多长时间的值

您可以更简单地使用断路器的manual controls

  • .Isolate()手动强制断开电路;
  • .Reset()手动重置电路。

当抛出给定异常时,您可以.Isolate()进行电路;并设置一个Timer以在异常指示该服务应该再次可用时调用Reset()