【问题标题】:Set durationOfBreak in Polly CircuitBreaker在 Polly CircuitBreaker 中设置 durationOfBreak
【发布时间】:2018-12-10 04:14:12
【问题描述】:

我正在将 Polly 断路器用于 API,如果服务因维护而停机,该 API 会引发用户定义的异常。 Exception 将包含一个值,服务将关闭多长时间。

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

例如

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

【问题讨论】:

    标签: c# polly


    【解决方案1】:

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

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

    针对具体场景:

    [the] 如果服务因维护而关闭,API 会抛出用户定义的异常 [which] 将包含一个值,服务将关闭多长时间

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

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

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

    【讨论】:

    • 我将研究 PolicyRegistry 的选项。我已经在考虑手动控制了,但这在我看来是一种非常“肮脏”的方式,
    • 另请注意,Polly 提供了 WaitAndRetry(...) 策略的重载,旨在处理响应中包含有关重试前等待多长时间的信息的情况。见github.com/App-vNext/Polly/wiki/…。从某种意义上说,断路器方法可能很有用,因为可以与其他调用者共享电路断开的事实。 retry-policy 可以提供另一种方法,以便每个调用者等待为其指定的任何 429 类型延迟。不需要更好/更差;只是另一种选择。
    猜你喜欢
    • 2021-12-03
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多