Установить длительность цикла в Polly CircuitBreaker - PullRequest
0 голосов
/ 08 декабря 2018

Я использую 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 голосов
/ 09 декабря 2018

Невозможно изменить durationOfBreak на существующем экземпляре CircuitBreakerPolicy после создания.

Для общей динамической реконфигурации во время работы команда Polly рекомендует атомарное обновление экземпляра политики, хранящегося в PolicyRegistry .

Для конкретного сценария:

[API] генерирует пользовательское исключение, если служба не работает для обслуживания [которая] будет содержать значение, как долго служба будет недоступна

Вы можете, проще говоря, использовать ручное управление выключателем :

  • .Isolate(), чтобы вручную принудительно отключить цепь;
  • .Reset() для ручного сброса цепи.

Вы можете .Isolate() цепь, когда выбрасывается данное исключение;и установите Timer для вызова Reset() на нем в то время, когда исключение указывает, что услуга должна снова стать доступной.

...