Каковы некоторые реализации фильтрации исключений в шаблоне автоматического выключателя? - PullRequest
4 голосов
/ 11 января 2010

Шаблон Автоматического выключателя , из книги Release It! , защищает удаленную службу от запросов во время ее сбоя (или восстановления) и помогает клиенту управлять повторным отказом удаленной службы,Мне нравится автоматическое выключение состояния Дэви Брайона и исправление отложенного тайм-аута Айенде очень чисто.

Однако я не видел много реализаций фильтрации , какие исключения приведут к увеличению количества отказов автоматического выключателя.


Не беспокойтесь о показе блокировки, если ваша реализация особо не зависит от умной блокировки.К вашему сведению, Фил Хаак, кажется, имеет последнюю версию TimedLock , используемую в статьях Дэйви Брайона.

Ответы [ 3 ]

3 голосов
/ 11 января 2010

Фильтр по предикату

Предикат может предоставлять расширенные критерии и логику фильтрации.

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;
    });
1 голос
/ 11 января 2010

Фильтр, который Типы не будут увеличивать количество

Тим Росс писал об этом .

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;
     }
}
1 голос
/ 11 января 2010

Фильтр, который Типы увеличит количество

Ваша первая мысль может заключаться в создании общего вызова метода с использованием общего блока 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;
    }
}
...