Domanda

Il Circuit Breaker modello , dal libro rilasciarlo ! , protegge un servizio remoto da richieste mentre sta venendo a mancare (o il recupero) e aiuta il cliente a gestire ripetuto fallimento servizio remoto. Mi piace stateful interruttore di Davy Brion e di Ayende pigro timeout correzione è molto pulito .

Tuttavia, non ho visto un sacco di implementazioni di filtraggio che eccezioni causerà un aumento del numero di fallimento di un interruttore.


Non preoccuparti per mostrare di chiusura, a meno che l'implementazione è particolarmente dipendente dal bloccaggio intelligente. Cordiali saluti, Phil Haack sembra avere il ultima versione di TimedLock , usato in articoli di Davy Brion.

È stato utile?

Soluzione

Filtro per Predicate

predicato possono fornire criteri estesi e logica di filtro.

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

        throw;
    }
}

Ad esempio, si può decidere di aumentare l'interruttore solo su un WebException causato da un timeout.

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

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

Altri suggerimenti

Filtro quali tipi aumenteranno il numero di

Il tuo primo pensiero potrebbe essere quello di costruire una chiamata di metodo generico con un blocco try... catch generico. Tuttavia, il seguito non funzionerà a causa di un bug .NET , consulta questi domande per ulteriori informazioni.

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

È necessario cattura tutte le eccezioni e indagare il tipo.

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

         throw;
    }
}

Filtro Quali tipi di non aumentare il numero

Tim Ross ha scritto su questo .

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;
     }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top