在 Polly CircuitBreaker 中设置 durationOfBreak

Set durationOfBreak in Polly CircuitBreaker

我正在使用 Polly Circuit Breaker 作为 API 如果服务因维护而停机,它会抛出用户定义的异常。 异常将包含服务将关闭多长时间的值。

是否可以configure/update处理第一个用户异常后的断路器策略?

例如

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)
    {
        …
    }
}

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

对于 general 在 运行 期间的动态重新配置,Polly 团队推荐 atomically updating a policy instance stored in the PolicyRegistry

针对具体场景:

[the] API throws a user defined Exception if service is down for maintenance [which] will contain a value how long the service will be down

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

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

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