断路器(CircuitBreaker)设计模式

断路器是电器时代的一个重要组成部分,后面老是有保险丝熔断或跳闸的断路器是安全的重要保障。html

微服务最近几年成为软件架构的热门话题,其益处多多。但须要知道的是,一旦开始将单块系统进行分解,就上了分布式系统的山头。java

在云或分布式系统环境中,任何对一致性或可靠性的表述就是谎话。咱们必须假设微服务的行为或其服务器位置会常常变更,其结果就是组件有时会提供低质量服务甚至可能完全没法提供服务。这些微服务的故障若是没有处理好,将致使整个系统的故障。git

微服务的故障多是瞬时故障:如慢的网络链接、超时,资源过分使用而暂时不可用;也多是不容易预见的突发事件的状况下须要更长时间来纠正的故障。github

分布式服务的容错是一个不得不考虑的问题,一般的作法有两种:设计模式

  • 重试机制:对于预期的短暂故障问题,经过重试模式是能够解决的。
  • 断路器(CircuitBreaker)模式:将受保护的服务封装在一个能够监控故障的断路器对象中,当故障达到必定门限,断路器将跳闸(trip),所 有后继调用将不会发往受保护的服务而由断路器对象之间返回错误。对于须要更长时间解决的故障问题,不断重试就没有太大意义了,可使用断路器模式。
    断路器(CircuitBreaker)设计模式

 

断路器模式设计状态机


断路器(CircuitBreaker)设计模式
 

注意事项

 

在决定如何实现这个模式时,您应考虑如下几点:安全

  • 异常处理。经过断路器调用操做的应用程序必须可以处理在操做不可用时可能被抛出的异常,该类异常的处理方式都是应用程序特有的。例如,应用程序会暂时降级其功能,调用备选操做尝试相同的任务或获取相同的数据,或者将异常通知给用户让其稍后重试。
  • 异常类型。一个请求可能因为各类缘由失败,其中有一些可能代表故障严重类型高于其余故障。例如,一个请求可能因为须要几分钟才能恢复的远程 服务崩溃而失败,也可能因为服务暂时超载形成的超时而失败。断路器有可能能够检查发生的异常类型,并根据这些异常本质调整策略。例如,促使切换到开状态 (跳闸)的服务超时异常个数要远多于服务彻底不可用致使的故障个数。
  • 日志记录。一个断路器应记录全部失败的请求(若是可能的话记录全部请求),以使管理员可以监视它封装下受保护操做的运行状态。
  • 可恢复性。应该配置断路器成与受保护操做最匹配的恢复模式。例如,若是断路器设定出入开状态的时间很长,即便底层操做故障已经解决它还会返回错误。若是开状态到半开状态切换过快,底层操做故障还没解决它就会再次调用受保护操做。
  • 测试失败的操做。在开状态下,断路器可能不用计时器来肯定什么时候切换到半开状态,而是经过周期性地查验远程服务或资源以肯定它是否已经再次可用。这个检查可能采用上次失败的操做的形式,也可使用由远程服务提供的专门用于测试服务健康情况的特殊操做。
  • 手动复位。在一个系统中,若是一个失败的操做的恢复时间差别很大,提供一个手动复位选项以使管理员可以强行关闭断路器(和复位故障计数器)多是有益的。一样,若是受保护操做暂时不可用,管理员能够强制断路器进入放状态(并从新启动超时定时器)。
  • 并发。同一断路器能够被应用程序的大量并发实例访问。断路器实现不该阻塞并发请求或对每一请求增长额外开销。
  • 资源分化。当断路器使用某类可能有多个底层独立数据提供者的资源时须要特别当心。例如,一个数据存储包含多个分区(shard),部分分区 出现暂时的问题,其余分区可能彻底工做正常。若是该场景中的错误响应是合并响应,应用程序在部分故障分区极可能会阻塞整个请求时仍会试图访问某些工做正常 的分区。
  • 加速断路。有时失败响应对于断路器实现来讲包含足够的信息用于断定应当当即跳闸并保持最小时间量的跳闸状态。例如,从过载共享资源的错误响应可能指示不推荐当即重试,且应用程序应当隔几分钟时间以后重试。
    若是一个请求的服务对于特定Web服务器不可用,能够返回HTTP协议定义的“HTTP 503 Service Unavailable”响应。该响应能够包含额外的信息,例如预期延迟持续时间。
  • 重试失败请求。在开状态下,断路器能够不是快速地简单返回失败,而是将每一个请求的详细信息记录日志并在远程资源或服务从新可用时安排重试。
  • 对外部服务的不恰当超时。当对外部服务配置的超时很大时,断路器可能没法保护其故障操做,断路器内的线程在指示操做失败以前仍将阻塞到外部服务上,同时不少其余应用实例仍会视图经过断路器调用服务。

 

断路器模式业界Java实现

 

GitHub:jruggedCircuitBreaker类源代码服务器

GitHub:Netflix/hystrix网络

 

参考

Martin Fowler:CircuitBreaker架构

MSDN:Circuit Breaker Pattern并发

Protect your software with the Circuit Breaker design pattern

相关文章
相关标签/搜索