好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

(二)—— 断路器模式.pdf

9页
  • 卖家[上传人]:豆浆
  • 文档编号:10169052
  • 上传时间:2017-09-02
  • 文档格式:PDF
  • 文档大小:302.53KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • ⼆)—— 断路器模式云计算设计模式(⼆)——断路器模式处理故障连接到远程服务或资源时,可能需要耗费⼤量的时间这种模式可以提⾼应⽤程序的稳定性和灵活性背景和问题在分布式环境中,如在云,其中,应⽤程序执⾏访问远程资源和服务的操作,有可能对这些操作的失败是由于瞬时故障,如慢的⽹络连接,超时,或者被过度使⽤的资源或暂时不可⽤这些故障⼀般之后的短时间内纠正⾃⼰,和⼀个强⼤的云应⽤应该准备使⽤的策略来处理它们,例如,通过重试模式进⾏说明但是,也可以是其中的故障是由于那些不容易预见的突发事件的情况下,这可能需要更长的时间来纠正这些故障从连接的部分损失到服务的完整的故障范围的严重程度在这种情况下,它可能是毫⽆意义的应⽤,不断重试执⾏的操作是不太可能成功,⽽不是应⽤程序应该很快接受该操作已失败,并相应地处理这个故障此外,如果⼀个服务是⾮常繁忙的,在系统中的⼀个部分出现故障可能会导致连锁故障例如,调⽤⼀个服务的操作可被配置成实现⼀个超时,如果该服务⽆法在这段时间内响应⼀个失败消息答复然⽽,这⼀策略可能导致许多并发请求的相同的操作,直到超时时段期满被阻⽌这些被禁⽌的请求可能会持有关键系统资源,如内存,线程,数据库连接等。

      因此,这些资源可能会耗尽,从⽽导致该系统的其他可能⽆关的部件,需要使⽤相同的资源的失败在这些情况下,这将是优选的操作⽴即失败,并且只尝试调⽤服务,如果它是可能成功注意,设置⼀个较短的超时可能有助于解决此问题,但在超时不应该如此之短,以致操作失败的⼤部分时间,即使该请求到服务最终会成功解决⽅案该断路器图案可以防⽌⼀个应⽤程序多次试图执⾏⼀个操作,即很可能失败,允许它继续⽽不等待故障恢复或者浪费 CPU 周期,⽽它确定该故障是持久的断路器模式也使应⽤程序能够检测故障是否已经解决如果问题似乎已经得到纠正​​,应⽤程序可以尝试调⽤操作注意断路器图案的⽬的是从该重试模式的不同重试模式使应⽤程序可以重试操作以期望它会成功断路器图案防⽌应⽤程序执⾏⼀个操作,即很可能失败⼀个应⽤程序可以通过使⽤重试模式,通过⼀个断路器调⽤操作结合这两种模式然⽽,在重试逻辑应该是由断路器返回任何异常敏感和放弃重试次数,如果断路器指⽰故障不是瞬时的断路器充当可能失败操作的代理代理应监测最近发⽣的故障数量,然后使⽤这个信息来决定是否允许该操作继续进⾏,或简单地⽴即返回⼀个异常代理可以被实现为状态机与模拟的电路断路器的功能如下状态:关闭:从应⽤程序的请求是通过对操作进⾏路由。

      代理保持最近的失败次数的计数,并且如果该呼叫到操作不成功,则代理递增该计数如果最近的失败次数超过了⼀个给定时间周期内的规定的阈值时,该代理将被置于打开状态在这⼀点上的代理启动⼀个超时定时器,当该定时器期满的代理放置到半开放状态注意超时定时器的⽬的是为了给系统时间,纠正允许应⽤程序尝试再次执⾏该操作之前导致失败的问题打开:从应⽤程序请求⽴即失败和异常返回给应⽤程序半开放:从应⽤程序请求的数量有限允许通过并调⽤运⾏如果这些请求是成功的,则假定先前导致故障的故障已修复和断路器切换到闭合状态(故障计数器被复位)如果任何请求失败,断路器假设故障仍然存在,因此恢复到打开状态,并重新启动超时定时器,系统的时间再延长,从故障中恢复注意半开的状态是很有⽤的,以防⽌恢复服务,从突然被淹没的请求作为服务恢复,也可能是能够⽀持请求的限制⾳量,直到恢复完成,但在恢复过程中,海量的⼯作可能会导致服务超时或再次失败下图展⽰出了⽤于⼀个可能的实现的电路断路器的状态图 1 - 断路器状态需要注意的是,在图 1 中,所⽤的封闭状态下的失败计数器是基于时间的它以定期⾃动复位这有助于防⽌断路器进⼊打开状态,如果它经受偶然的失败;这使断路器跳闸进⼊打开状态的故障阈值时,故障的指定数量的指定的时间间隔期间发⽣的仅达到。

      所使⽤的半开状态下的成功计数器记录成功尝试调⽤的操作的数量断路器恢复到封闭状态后的连续操作调⽤中指定数量的已成功如果任何调⽤失败时,断路器⽴即进⼊打开状态,并且成功的计数器将其进⼊半开状态下⼀次复位Note如何将系统恢复从外部处理,可能通过恢复或重新启动故障部件或修理的⽹络连接执⾏断路器图案增加了稳定性和灵活性,以⼀个系统,提供稳定性,⽽系统从故障中恢复,并尽量减少此故障的对性能的影响它可以帮助快速地拒绝对⼀个操作,即很可能失败,⽽不是等待操作超时(或者不返回)的请求,以保持系统的响应时间如果断路器提⾼每次改变状态的时间的事件,该信息可以被⽤来监测由断路器保护系统的部件的健康状况,或以提醒管理员当断路器跳闸,以在打开状态模式是可定制的,并且可以根据可能的故障的性质进⾏调整例如,您可以申请增加的超时时间为⼀个断路器可以放置在打开状态的断路器的⼏秒钟开始,然后,如果故障⼀直没有解决增加超时到⼏分钟的时间,等等在某些情况下,⽽不是打开状态返回故障并提⾼了异常,也可能是有⽤的,返回⼀个缺省值,该值是有意义的应⽤问题和注意事项在决定如何实现这个模式时,您应考虑以下⼏点:异常处理通过断路器调⽤操作的应⽤程序必须准备好处理,如果该操作是不可⽤的,可以被抛出的异常。

      在这样的异常处理将特定应⽤程序的⽅式例如,⼀个应⽤程序可以暂时降低其功能,调⽤替换操作来尝试执⾏相同的任务或获得相同的数据,或者报告该异常给⽤户,并要求他们稍后再试例外的类型⼀个请求可能失败的原因有多种,其中有⼀些可能指⽰更严重的类型的失效⽐其他例如,⼀个请求可能会失败,因为远程服务已经崩溃了,可能需要⼏分钟才能恢复,或失败可能是由于该服务被暂时超载造成的超时时间⼀种断路器可能能够检查发⽣的异常的类型,并根据这些异常的性质调整策略例如,它可能需要的超时异常更⼤数⽬的断路器的开状态相⽐失败次数跳闸由于服务是完全不可⽤⽇志记录⼀个断路器应记录所有失败的请求(也可能是成功的请求),以使管理员能够监视它封装了操作的健康可恢复性您应该配置断路器与之相匹配的是保护的操作可能恢复模式例如,如果断路器保持在打开状态下很长⼀段时间,也可能产⽣异常,即使对于失败的原因早已得到了解决类似地,⼀个断路器可以振荡并降低应⽤程序的响应时间,如果它从打开状态到半开状态太快切换测试失败的操作在打开状态下,⽽不是使⽤⼀个计时器来确定何时切换到半开放状态下,断路器可代替周期性地查验远程服务或资源,以确定它是否已经再次变得可⽤。

      这个平可以采取的企图的形式援引了以前失败的操作,也可以使⽤由远程服务提供的特殊操作专门⽤于测试服务的健康状况,所描述的卫⽣端点监测图案⼿动覆盖在⼀个系统中,如果恢复时间为⼀个失败的操作是⾮常可变的,它可能是有利的,以提供⼀个⼿动复位选项,使管理员能够强⾏关闭断路器(和复位的故障计数器)同样,管理员可以强制断路器进⼊开放状态(并重新启动超时定时器),如果由断路器保护动作暂时不可⽤相同的电路断路器可以通过⼤量的应⽤程序的并⾏实例来访问实施不应该阻塞并发请求或添加过多的开销,以每次调⽤操作资源分化使⽤单个断路器时,⼀个类型的资源,如果​​可能有多个潜在的独⽴供应商要⼩⼼例如,在数据存储器,其包括多个碎⽚,1分⽚可以是完全可访问的,⽽另⼀个是经历⼀个暂时的问题如果在这些情况下的错误响应被合⼆为⼀,应⽤程序可能试图访问⼀些碎⽚,即使发⽣故障的可能性⾼,同时获得其他碎⽚,即使它是可能成功的可能被堵塞加速断路有时失败响应可以包含⾜够的信息⽤于断路器的实施知道它应当⽴即跳闸并保持处于跳闸状态的最⼩时间量例如,从该过载的共享资源的错误响应可以指⽰⽴即重试时不推荐使⽤,并且该应⽤程序应代替再次尝试在⼏分钟时间。

      NoteHTTP 协议定义的“HTTP503 服务不可⽤”,它可以如所请求的服务是当前不可⽤的特定的 Web 服务器上的被返回的响应此响应可以包括附加信息,例如延迟的预期持续时间重播失败的请求在打开状态下,⽽不是简单的故障很快,断路器也可以记录每个请求的详细信息,以轴颈和安排这些请求时,远程资源或服务变得可⽤重放对外部服务不当超时电路断路器可能⽆法充分保护的应⽤程序,从失败中配置有⼀个漫长的超时时间对外服务业务如果超时太长,运⾏⼀个断路器的螺纹可能被堵塞长时间之前断路器指⽰操作已失败在这个时候,许多其他的应⽤程序实例也可以尝试通过断路器来调⽤服务,并占⽤⼀个显著的线程数之前,他们都失败当使⽤这个模式使⽤这种模式:为了防⽌⼀个应⽤程序试图调⽤⼀个远程服务或访问共享资源,如果​​该操作是极有可能失败这种模式可能不适合:对于处理中的应⽤程序访问本地专⽤资源,例如在存储器内数据结构在这种环境下,使⽤断路器只会增加开销到您的系统作为⼀个替代品来处理异常在应⽤程序的业务逻辑例⼦在 Web 应⽤中,⼏个页⾯的已填充了从外部服务中检索数据如果该系统实现了最⼩的缓存,点击率最⾼的为每个页⾯都会导致往返服务。

      从 Web 应⽤程序到服务的连接可以⽤⼀个超时时间段(通常为 60 秒)进⾏配置,并且如果该服务没有在这个时间响应在每个⽹页的逻辑将假设该服务不可⽤,并且抛出异常但是,如果服务失败,系统⾮常繁忙,⽤户可能会被迫等待异常发⽣时长达60秒前最终的资源,如内存,连接和线程可能被耗尽,以防⽌其他⽤户连接到系统,即使它们没有访问检索业务数据的页⾯通过添加更多的 Web 服务器和执⾏负载均衡扩展,系统可能会延误的点资源趋于枯竭,但它不会解决问题,因为⽤户请求仍然会反应迟钝,所有的 Web 服务器仍然可以最终耗尽资源包裹连接到服务,并检索数据中的断路器的逻辑可以帮助缓解这个问题的影响,并且更优雅处理服务故障⽤户请求仍然会失败的,但它们将更加迅速地失败,并且资源不会被阻塞该CircuitBreaker类维护有关的对象,它实现下⾯的代码所⽰ICircuitBreakerStateStore接⼜电路断路器的状态信息interface ICircuitBreakerStateStore { CircuitBreakerStateEnum State { get; } Exception LastException { get; } DateTime LastStateChangedDateUtc { get; } void Trip(Exception ex); void Reset(); void HalfOpen(); bool IsClosed { get; } }状态属性指⽰断路器的当前状态,以及由 CircuitBreakerStateEnum 枚举所定义的将是这些值中的⼀个程序,HalfOpen,或者已关闭。

      如果电路断路器闭合,但如果其打开或半开的 IsClosed 属性应该是真实的跳闸⽅法切换断路器为打开状态的状态,并记录该引起状态变化的异常,与所发⽣的异常的⽇期和时间⼀起该 LastException 和LastStateChangedDateUtc 属性返回此信息复位⽅法关闭断路器和 HalfOpen ⽅法将断路器半开在该实例中 InMemoryCircuitBreakerStateStore 类包含 ICircuitBreakerStateStore 接⼜的实现该 CircuitBreaker 类创建这个类的⼀个实例来保存断路器的状态在 CircuitBreaker 类的 ExecuteAction ⽅法包装的操作(在 Action 委托的形式)可能会失败当该⽅法运⾏时,它⾸先检查断路器的状态如果它被关闭(当地 IsOpen 属性,如果断路器处于打开状态或半开,返回真,是假的)的 ExecuteAction ⽅法试图调⽤ Action 委托如果此操作失败,异常处理程序执⾏ TrackException ⽅法,⽤于设置该电路断路器的状态通过调⽤ InMemoryCircuitBreakerStateStore 物体的⾏程的⽅法打开。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.