5

サーキットブレーカーパターン、本「Release It! 」より 、障害が発生している(または回復している)間、リモートサービスを要求から保護し、クライアントが繰り返し発生するリモートサービスの障害を管理するのに役立ちます。私はデイビーブリオンのステートフルサーキットブレーカーが好きで、アイエンデの怠惰なタイムアウト修正はとてもきれいです。

ただし、例外によってサーキットブレーカの障害数が増加するフィルタリングの実装はあまり見たことがありません。


実装が特に巧妙なロックに依存している場合を除いて、ロックの表示について心配する必要はありません。参考までに、Phil Haackは、DavyBrionの記事で使用されているTimedLockの最新バージョンを持っているようです。

4

3 に答える 3

4

述語によるフィルタリング

述語は、拡張基準とフィルタリングロジックを提供できます。

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

        throw;
    }
}

たとえばWebException、タイムアウトが原因でのみ回路ブレーカーを増やしたい場合があります。

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

        return local.Status == WebExceptionStatus.Timeout;
    });
于 2010-01-11T17:08:00.863 に答える
2

どのタイプがカウントを増やすかをフィルタリングします

最初に考えたのは、ジェネリックtry... catchブロックを使用してジェネリックメソッド呼び出しを作成することです。ただし、以下は.NETのバグのために機能しません。詳細については、これらの 質問を参照してください。

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

すべての例外をキャッチし、タイプを調査する必要があります。

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

         throw;
    }
}
于 2010-01-11T17:06:15.110 に答える
2

どのタイプがカウントを増加させないかをフィルタリングします

ティムロスはこれについて書いた

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;
     }
}
于 2010-01-11T17:06:47.667 に答える