Quelles sont certaines implémentations de filtrage d'exception dans le modèle de disjoncteur?

StackOverflow https://stackoverflow.com/questions/2043419

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.

Était-ce utile?

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;
     }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top