Ant*_*ean 5 c# exception-handling circuit-breaker
该断路器模式,从书版本吧!, 保护远程服务在失败(或恢复)时免受请求,并帮助客户端管理重复的远程服务失败。我喜欢Davy Brion 的有状态断路器,而Ayende 的惰性超时修复非常干净。
但是,我还没有看到很多过滤哪些异常会导致断路器故障计数增加的实现。
不要担心显示锁定,除非您的实现特别依赖于巧妙的锁定。仅供参考,Phil Haack 似乎拥有最新版本的 TimedLock,在 Davy Brion 的文章中使用。
谓词可以提供扩展的标准和过滤逻辑。
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)