我如何使用断路器?我正在寻找一种方法来远程调用不受我控制的服务,直到连接成功。我也不想简单地设置一个计时器来每隔n秒/分钟执行一次操作,直到它成功。经过大量研究,断路器模式似乎很合适。我找到了一个使用CastleWindsor拦截器的实现,看起来很棒。唯一的问题是我不知道如何使用它。从我找到的关于这个主题的几篇文章中,我能找到的唯一用法示例是简单地使用断路器只调用一次操作,这似乎不是很有用。由此看来,我需要简单地在带有断路器的while(true)循环中运行我的操作。我如何使用Windsor拦截器执行调用外部服务的操作,直到它成功而不关闭我们的服务器?有人可以填补缺失的部分吗?这是我能想到的while(true){try{service.Subscribe();休息;}catch(Exceptione){Console.WriteLine("Gotcha!");Thread.Sleep(TimeSpan.FromSeconds(10));}}Console.WriteLine("成功!");公共接口IService{voidSubscribe();}公共类服务:IService{privatereadonlyRandom_random=newRandom();publicvoidSubscribe(){vara=_random.Next(0,10)%2421;if(_random.Next(0,10)%2!=0)thrownewAbandonedMutexException();基于此,我想我现在理解了这个概念以及如何应用它。如果您有许多线程访问同一资源,这是一个有趣的想法。其工作方式是聚合所有线程的尝试计数。与其担心编写一个在实际失败之前尝试访问数据库5次的循环,不如让断路器跟踪所有访问资源的尝试。在一个例子中,你说5个线程运行这样一个循环(伪代码):interrorCount=0;while(errorCount假设你的错误处理是正确的,这个循环可以运行5次并且总共ping资源50次...断路器试图减少它尝试到达资源的总次数。每个线程或请求尝试将增加错误计数器。一旦达到错误限制,断路器将不会尝试连接到其资源,因此不会有线程进行更多调用。轮询资源直到它准备好仍然具有相同的效果,但是您减少了totalload.staticvolatileinterrorCount=0;while(errorCount就是这个拦截器实现的,注册为单例。所以对于任何方法的任何调用,你的资源类的所有实例都会先通过断路器重定向代码。拦截器只是您类的代理。它基本上覆盖了您的方法,并且在调用您的方法时调用了拦截器方法。如果您对电路理论没有任何了解,开/关位可能会造成混淆。Wiki:如果电路在其电源的正负端子之间缺少完整路径,则该电路是“开路”理论上,该电路在连接断开时打开,在连接可用时闭合。你的例子的重要部分是:publicvoidIntercept(IInvocationinvocation){/*仅在状态为Open时抛出异常,否则不执行任何操作。*/}尝试{调用。继续();/*告诉拦截器为被代理的类调用“实际”方法。*/}catch(Exceptione){使用(TimedLock.Lock(monitor)){failures++;/*递增共享错误计数*/state.ActUponException(e);/*仅在ClosedState类中实现,因此如果错误计数达到阈值,它会将状态更改为Open。*/}扔;}使用(TimedLock.Lock(monitor)){state.ProtectedCodeHasBeenCalled();/*仅在HalfOpen中实现,如果它成功,“开关”将被抛到关闭位置*/}}我创建了一个名为CircuitBreaker.Net的电路库,它封装了所有服务逻辑以安全地执行调用。它易于使用,示例可能如下所示://初始化断路器varcircuitBreaker=newCircuitBreaker(TaskScheduler.Default,maxFailures:3,invocationTimeout:TimeSpan.FromMilliseconds(100),circuitResetTimeout:TimeSpan.FromMilliseconds(10000));try{//通过断路器执行潜在的脆弱调用circuitBreaker.Execute(externalService.Call);//或其异步版本//awaitcircuitBreaker.ExecuteAsync(externalService.CallAsync);}catch(CircuitBreakerOpenException){//服务不可用,这里故障转移}catch(CircuitBreakerTimeoutException){//处理超时}catch(Exception){//处理其他意外异常}它可以通过nuget包获得。您可以在github上找到这些资源。以上是C#学习教程:如何使用断路器?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
