Quelles sont certaines implémentations de filtrage d'exception dans le modèle de disjoncteur?
-
19-09-2019 - |
Question
Circuit Breaker modèle , à partir du Release Il ! , protège un service à distance des demandes alors qu'il ne parvient pas (ou récupérer) et aide le client à gérer l'échec de service à distance répété. J'aime disjoncteur stateful de Davy Brion et correction délai d'attente paresseux de Ayende est très propre .
Cependant, je ne l'ai pas vu beaucoup de implémentations de filtrage qui exceptions entraînera une augmentation du nombre de défaillance d'un disjoncteur.
Ne vous inquiétez pas de montrer le verrouillage, à moins que votre mise en œuvre est particulièrement dépendante de verrouillage intelligent. Pour votre information, Phil Haack semble avoir dernière version de TimedLock, utilisé dans les articles de Davy Brion.
La solution
Filtrer par prédicat
prédicat peut fournir des critères étendus et de la logique de filtrage.
public void AttemptCall(Action action, Predicate<Exception> match)
{
try
{
action();
}
catch(Exception e)
{
if(match(e))
state.ActUponException(e);
throw;
}
}
Par exemple, vous pouvez augmenter seulement le disjoncteur sur un WebException
causé par un délai d'attente.
circuitBreaker.AttemptCall(() => service.DoWork(), e =>
{
WebException local = e as WebException;
if(local == null)
return false;
return local.Status == WebExceptionStatus.Timeout;
});
Autres conseils
Filtre quels types augmentera le nombre
Votre première pensée peut être de construire un appel de méthode générique avec un bloc de try... catch
générique. Cependant, le ci-dessous ne fonctionnera pas en raison de un bug .NET , s'il vous plaît voir ces questions pour plus d'informations.
public void AttemptCall<TException>(Action action)
where TException : Exception
{
try
{
action();
}
catch(TException e)
{
state.ActUponExcpetion(e);
throw;
}
}
Vous devez attraper toutes les exceptions et enquêter sur le type.
public void AttemptCall<TException>(Action action)
where TException : Exception
{
try
{
action();
}
catch(TException e)
{
if(e is TException)
state.ActUponExcpetion(e);
throw;
}
}
Filtre quels types n'augmenter le nombre
Tim Ross a écrit au sujet de cette .
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;
}
}