Polly Circuit Breaker 처리 및 처리되지 않은 예외

Nov 24 2020

Polly를 사용하여 회로 차단기 패턴을 구현하고 싶습니다.

문서 에는 Half Open 상태에 대한 설명이 있으며 거기에 다음과 같이 표시됩니다.

  • 처리 된 예외가 수신되면 해당 예외가 다시 발생하고 회로는 즉시 다시 열린 상태로 전환되고 구성된 기간 동안 다시 열린 상태로 유지됩니다.
  • 처리되지 않은 예외가 수신되면 회로는 반 개방 상태로 유지됩니다.

여기서 처리 된 예외와 처리되지 않은 예외의 차이점을 이해하지 못합니다. 정책에 의해 작업이 실행되고 예외가 발생하는 경우를 설명합니다.

예외가 처리되었다고 할 때 처리되고 있다는 의미는 어디입니까? 우리가 말했듯이, 그 행동이 그것을 던 졌기 때문에 그것이 처리되지 않았다는 것을 의미하지 않습니까?

반 개방 상태가 반 개방 상태이고 언제 열림으로 전환되는지 완전히 이해하지 못합니다.

답변

1 PeterCsala Nov 25 2020 at 09:20

회로 차단기 정책을 정의 할 때 CB 구현에서 어떤 종류의 예외를 고려해야하는지 정의 할 수 있습니다 . 즉, 실패한 실행으로 처리되어야하고 연속 실패 횟수에 포함되어야하는 예외를 나열 할 수 있습니다.

Handle<T>Or<T>메서드 호출을 조합하여 예외 목록을 정의 할 수 있습니다 .

간단한 예를 통해이 개념을 자세히 살펴 보겠습니다.

var retry = Policy
    .Handle<ArgumentException>()
    .Or<NotSupportedException>()
    .WaitAndRetry(5, _ => TimeSpan.FromSeconds(1),
        onRetry: (exception, delay, context) => Console.WriteLine($"{"Retry",-10}{delay,-10:ss\\.fff}: {exception.GetType().Name}")); var circuitBreaker = Policy .Handle<ArgumentException>() .CircuitBreaker(2, TimeSpan.FromSeconds(1), onBreak: (ex, @break) => Console.WriteLine($"{"Break",-10}{@break,-10:ss\\.fff}: {ex.GetType().Name}"),
        onReset: () => Console.WriteLine($"{"Reset",-10}"), onHalfOpen: () => Console.WriteLine($"{"HalfOpen",-10}"));
  • 회로 차단기 정책은 모든 ArgumentExceptions ( ArgumentNullException및 포함 ArgumentOutOfRangeException)를 처리 된 예외로 간주합니다 .
    • 즉, 호출 된 대리자가이 세 가지 예외 중 하나를 throw하면 연속 실패 횟수가 증가하고 임계 값에 도달하면 중단됩니다.
  • 재시도 정책은 다음 ArgumentException과 같은 경우에 트리거됩니다 NotSupportedException.
    • 이들 중 하나가 발생하면 1 초 동안 휴면 한 다음 동일한 델리게이트를 다시 실행하려고합니다.

따라서 회로 차단기 관점에서 a NotSupportedException가 던져 지면 고려되지 않으므로 >> 따라서 이름이 처리되지 않습니다.

이것은 우리의 샘플 방법은 어느 쪽 던질 것이다 구현되는 방법이다 ArgumentException또는를 NotSupportedException:

private static int count = 0;
private const int threshold = 3;
static void SampleCall()
{
    count++;
    if (count >= threshold) throw new NotSupportedException();
    throw new ArgumentException("Nothing");
}

정책의 사용 :

var strategy = Policy.Wrap(retry, circuitBreaker);

try
{
    strategy.Execute(SampleCall);
    Console.WriteLine("Succeeded");
}
catch (NotSupportedException)
{
    Console.WriteLine("Failed");
}

threshold가 3으로 설정된 경우 출력

Retry     01.000    : ArgumentException
Break     01.000    : ArgumentException
Retry     01.000    : ArgumentException
HalfOpen
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Failed

CB가 HalfOpen상태 로 전환 된 후에는 s SampleCall만 던집니다 NotSupportedException. 이것은 CB에 의해 처리되지 않으므로 HalfOpen주에 남아 있습니다 .

threshold가 2로 설정된 경우 출력

Retry     01.000    : ArgumentException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Failed

CB는 연속 2 개가 없었기 때문에 중단되지 않았습니다 ArgumentException. 그러나 재 시도는 NotSupportedException.

threshold가 4로 설정된 경우 출력

Retry     01.000    : ArgumentException
Break     01.000    : ArgumentException
Retry     01.000    : ArgumentException
HalfOpen
Break     01.000    : ArgumentException
Retry     01.000    : ArgumentException
HalfOpen
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Failed

(가) 때문에 SampleCall던져 한 ArgumentException인증 기관이에있을 때 HalfOpenCB 간주 이유 상태에서 예외를 처리하고 자체에서 전송로 HalfOpenOpen.