断路器模式中异常过滤的一些实现是什么?

Ant*_*ean 5 c# exception-handling circuit-breaker

断路器模式,从书版本吧!, 保护远程服务在失败(或恢复)时免受请求,并帮助客户端管理重复的远程服务失败。我喜欢Davy Brion 的有状态断路器,Ayende 的惰性超时修复非常干净。

但是,我还没有看到很多过滤哪些异常会导致断路器故障计数增加的实现。


不要担心显示锁定,除非您的实现特别依赖于巧妙的锁定。仅供参考,Phil Haack 似乎拥有最新版本的 TimedLock,在 Davy Brion 的文章中使用。

Ant*_*ean 4

按谓词过滤

谓词可以提供扩展的标准和过滤逻辑。

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

        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

WebException例如,您可能只想在由超时引起的情况下增加断路器。

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

        return local.Status == WebExceptionStatus.Timeout;
    });
Run Code Online (Sandbox Code Playgroud)