天天看点

SpringCloud-Hystrix服务熔断和服务降级

什么是服务熔断?

熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。

这种牺牲局部,保全整体的措施就叫做熔断。服务熔断也被称为服务过载保护。

如果不采取熔断措施,我们的系统会怎样呢?我们来看一个栗子。

当前系统中有A,B,C三个服务,服务A是上游,服务B是中游,服务C是下游。它们的调用链如下:

SpringCloud-Hystrix服务熔断和服务降级

一旦下游服务C因某些原因变得不可用,积压了大量请求,服务B的请求线程也随之阻塞。线程资源逐渐耗尽,使得服务B也变得不可用。紧接着,服务A也变为不可用,整个调用链路被拖垮。

SpringCloud-Hystrix服务熔断和服务降级

像这种调用链路的连锁故障,叫做雪崩。

正所谓刮骨疗毒,壮士断腕。在这种时候,就需要我们的熔断机制来挽救整个系统。熔断机制的大体流程和刚才所讲的考试策略如出一辙:

SpringCloud-Hystrix服务熔断和服务降级

这里需要解释两点:

  1. 开启熔断

在固定时间窗口内,接口调用超时比率达到一个阈值,会开启熔断。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的默认方法,达到服务降级的效果。

2. 熔断恢复

熔断不可能是永久的。当经过了规定时间之后,服务将从熔断状态恢复过来,再次接受调用方的远程调用。

Hystrix设计了三种状态:

  1. 熔断关闭状态(Closed)

    服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。

  2. 熔断开启状态(Open)

    在固定时间窗口内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50%),会进入熔断开启状态。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。

  3. 半熔断状态(Half-Open)

    在进入熔断开启状态一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态。所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。

    三个状态的转化关系如下图:

    SpringCloud-Hystrix服务熔断和服务降级

服务熔断和服务降级的比较

服务熔断对服务提供了proxy,防止服务不可能时,出现串联故障(cascading failure),导致雪崩效应。

服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑。

  1. 共性:

    目的 -> 都是从可用性、可靠性出发,提高系统的容错能力。

    最终表现->使某一些应用不可达或不可用,来保证整体系统稳定。

    粒度 -> 一般都是服务级别,但也有细粒度的层面:如做到数据持久层、只许查询不许增删改等。

    自治 -> 对其自治性要求很高。都要求具有较高的自动处理机制。

  2. 区别:

    触发原因 -> 服务熔断通常是下级服务故障引起;服务降级通常为整体系统而考虑。

    管理目标 -> 熔断是每个微服务都需要的,是一个框架级的处理;而服务降级一般是关注业务,对业务进行考虑,抓住业务的层级,从而决定在哪一层上进行处理:比如在IO层,业务逻辑层,还是在外围进行处理,主要是再客户端调用的一层处理。

    实现方式 -> 代码实现中的差异。

  3. 其实可以认为:服务熔断是服务降级的措施。

继续阅读