Skip to content

熔断降级

Eric Zhao edited this page May 22, 2020 · 25 revisions

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于分布式系统中调用关系的复杂性,如果调用链路中的某个服务不稳定,则依赖该服务的调用方自身可能会被慢调用卡住,最终会导致整个链路请求堆积。

dependnecy-map

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如慢调用或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断。Sentinel 熔断降级基于熔断器模式实现。

circuit-breaker

熔断策略

Sentinel Go 提供以下几种熔断策略:

  • 慢调用比例 (SlowRequestRatio):在单位统计时长内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。需要设置允许的最长响应时间,请求的响应时间大于该值则统计为慢调用。
  • 错误比例 (ErrorRatio):在单位统计时长内资源请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
  • 错误数 (ErrorCount):在单位统计时长内资源请求数目大于设置的最小请求数目,并且异常数大于阈值,则接下来的熔断时长内请求会自动被熔断。

注意:错误熔断仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockError)不生效。对于自定义埋点,为了统计异常比例或异常数,需要通过 api.TraceError(err) 记录业务异常。

示例

熔断降级 demo 可以参考 https://github.com/alibaba/sentinel-golang/blob/master/example/circuitbreaker/circuit_breaker_example.go

模型设计

Sentinel 熔断降级主要涉及两个数据模型:circuit breaking rule 和 circuit breaker。

  • circuit breaking rule:用于保存熔断降级规则的静态数据,比如熔断降级策略的类型,resource 信息等等。
  • circuit breaker:表示具体的熔断器,每一种熔断降级规则都会对应一种熔断器。circuit breaker会保存一些动态数据,比如统计数据,熔断器状态机等等。

Rule Manager负责维护所有的熔断规则和熔断器,以及规则和熔断器的动态更新。

数据模型关系可以参考下面的图:

                                          |                                                                                                                    
                                          |                                                                                                                    
                                          |                                                                                                                    
                                          |                                                                                                                    
                                          |  update rules dynamically                                                                                          
                                          |                                                                                                                    
                                          |                                                                                                                    
                                          |                                                                                                                    
                +-------------------------+-------------------------------------------------------------------------------------------------------------------+
     entry      |                         |                                  Circuit Breaker Slot                                                             |
                |                         v                                                                                                                   |
  --------------+->                                                                                                                                           |
                |                                                                                                                                             |
                |  +-----------------------------+    +-----------------------------+    +-----------------------------+   +-----------------------------+    |
                |  | +-------------------------+ |    | +-------------------------+ |    | +-------------------------+ |   | +-------------------------+ |    |
                |  | |                         | |    | |                         | |    | |                         | |   | |                         | |    |
                |  | |  AverageRtBreakerRule   | |    | |  ErrorRatioBreakerRule  | |    | |  ErrorCountBreakerRule  | |   | |     XXXBreakerRule      | |    |
                |  | |                         | |    | |                         | |    | |                         | |   | |                         | |    |
                |  | +-----------^-------------+ |    | +------------^------------+ |    | +-----------^-------------+ |   | +------------^------------+ |    |
                |  |             |               +--->|              |              +--->|             |               +-->|              |              |    |
                |  | +-----------+-------------+ |    | +------------+------------+ |    | +-----------+-------------+ |   | +------------+------------+ |    |
                |  | | AverageRtCircuitBreaker | |    | |ErrorRatioCircuitBreaker | |    | |ErrorCountCircuitBreaker | |   | | XXXCountCircuitBreaker  | |    |
                |  | |       .CanPass()?       | |    | |       .CanPass()?       | |    | |       .CanPass()?       | |   | |       .CanPass()?       | |    |
                |  | |                         | |    | |                         | |    | |                         | |   | |                         | |    |
                |  | +-------------------------+ |    | +-------------------------+ |    | +-------------------------+ |   | +-------------------------+ |    |
                |  +-----------------------------+    +-----------------------------+    +-----------------------------+   +-----------------------------+    |
                |                                                                                                                                             |
                +---------------------------------------------------------------------------------------------------------------------------------------------+

扩展设计

现有设计还是复用的滑动窗口的统计数据,后续可以再 Circuit Breaker里面保存自己独有的一些统计数据,做一些比如中位数的统计来做熔断判断,或则监控日志的数据聚合回哺熔断器等等。

基于现有设计可以保持足够的扩展性。