¿Cuáles son algunas implementaciones de filtrado de excepción en el patrón de cortacircuitos?
-
19-09-2019 - |
Pregunta
La Circuito patrón del interruptor , de la liberarlo ! , protege a un servicio remoto de solicitudes mientras se está fallando (o recuperar) y ayuda al cliente es propietario repitió fallo en el servicio remoto. Me gusta con estado disyuntor de Davy Brion y de Ayende perezoso solución de tiempo de espera es muy limpio .
Sin embargo, no he visto un montón de implementaciones de filtrado las excepciones que causarán un aumento en el recuento de fallo de un interruptor de circuito.
No se preocupe acerca de mostrar bloqueo, a menos que su aplicación es particularmente dependiente de bloqueo inteligente. Para su información, Phil Haack parece tener el versión más reciente de TimedLock , usa en artículos de Davy Brion.
Solución
Filtrar por predicado
A predicado pueden proporcionar criterios extendidos y lógica de filtrado.
public void AttemptCall(Action action, Predicate<Exception> match)
{
try
{
action();
}
catch(Exception e)
{
if(match(e))
state.ActUponException(e);
throw;
}
}
Por ejemplo, es posible que desee aumentar el interruptor automático sólo en un WebException
causada por un tiempo de espera.
circuitBreaker.AttemptCall(() => service.DoWork(), e =>
{
WebException local = e as WebException;
if(local == null)
return false;
return local.Status == WebExceptionStatus.Timeout;
});
Otros consejos
Filtro qué tipos aumentarán el recuento
Su primer pensamiento puede ser la construcción de una llamada a un método genérico con un bloque try... catch
genérico. Sin embargo, el siguiente no funcionará debido a un error .NET , por favor ver estos preguntas para obtener más información.
public void AttemptCall<TException>(Action action)
where TException : Exception
{
try
{
action();
}
catch(TException e)
{
state.ActUponExcpetion(e);
throw;
}
}
Es necesario capturar todas las excepciones e investigar el tipo.
public void AttemptCall<TException>(Action action)
where TException : Exception
{
try
{
action();
}
catch(TException e)
{
if(e is TException)
state.ActUponExcpetion(e);
throw;
}
}
Filtro qué tipos no va a aumentar el conteo
Tim Ross escribió acerca de esta .
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;
}
}