문제

그만큼 회로 차단기 패턴, 책에서 그것을 풀어라!, 원격 서비스가 실패(또는 복구)되는 동안 요청으로부터 보호하고 클라이언트가 반복되는 원격 서비스 실패를 관리하는 데 도움을 줍니다.좋아요 Davy Brion의 상태 저장 회로 차단기 그리고 Ayende의 지연 시간 초과 수정 매우 깨끗합니다.

그런데 본게 별로 없네요 필터링 구현 회로 차단기의 실패 횟수가 증가하는 예외는 무엇입니까?


구현이 특히 영리한 잠금에 의존하지 않는 한 잠금 표시에 대해 걱정하지 마십시오.참고로 Phil Haack은 최신 버전의 TimedLock, Davy Brion의 기사에 사용되었습니다.

도움이 되었습니까?

해결책

조건자로 필터링

술부 확장된 기준과 필터링 논리를 제공할 수 있습니다.

public void AttemptCall(Action action, Predicate<Exception> match)
{
    try
    {
        action();
    }
    catch(Exception e)
    {
        if(match(e))
            state.ActUponException(e);

        throw;
    }
}

예를 들어, 특정 회로에서만 회로 차단기를 높일 수 있습니다. WebException 시간 초과로 인해 발생했습니다.

circuitBreaker.AttemptCall(() => service.DoWork(), e =>
    {
        WebException local = e as WebException;
        if(local == null)
            return false;

        return local.Status == WebExceptionStatus.Timeout;
    });

다른 팁

카운트를 늘릴 유형을 필터링하세요.

첫 번째 생각은 일반 메소드 호출을 일반 메소드로 구성하는 것일 수 있습니다. try... catch 차단하다.그러나 아래의 작업은 작동하지 않습니다. .NET 버그, 참조하세요 이것들 질문 자세한 내용은.

public void AttemptCall<TException>(Action action)
    where TException : Exception
{
    try
    {
        action();
    }
    catch(TException e)
    {
         state.ActUponExcpetion(e);
         throw;
    }
}

당신은 모든 예외를 잡아라 그리고 종류를 조사해 보세요.

public void AttemptCall<TException>(Action action)
    where TException : Exception
{
    try
    {
        action();
    }
    catch(TException e)
    {
         if(e is TException)
             state.ActUponExcpetion(e);

         throw;
    }
}

카운트가 증가하지 않는 유형 필터링

팀 로스는 이에 대해 썼습니다..

private readonly List<Exception> ignored = new List<Exception>();

public void Ignore<TException>() 
    where TException : Exception
{
    Type type = typeof(TException);
    if(ignored.Contains(type))
        return;

    ignored.Add(type);
}

public void AttemptCall(Action action)
{
     try
     {
         action();
     }
     catch(Exception e)
     {
         if(!ignore.Contains(e.GetType()))
             state.ActUponException(e);

         throw;
     }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top