Quali sono alcune implementazioni di filtraggio delle eccezioni nel modello Circuit Breaker?
-
19-09-2019 - |
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.
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;
}
}