我一直误以为 服务降级 和 服务熔断 是一回事……
服务雪崩
从服务雪崩开始讲起。
假设存在如下调用链,而此时,Service A 的流量突然增加!这种情况下,即使 Service A 扛得住请求,Service B 和 Service C 也未必能扛得住这突发的请求。
若此时 Service C 因为抗不住请求,变得不可用。那么 Service B 的请求也会阻塞,慢慢耗尽 Service B 的线程资源,进而 Service B 就会变得不可用,紧接着 Service A 也会不可用。
![](https://img.haomeiwen.com/i2708793/5494dbf18b2a6a0f.png)
一个服务失败,导致整条链路的服务都失败的情形,称之为服务雪崩。而 服务熔断 和 服务降级 是解决服务雪崩的手段之一。
降级
什么是服务降级呢?降级主要有以下几种情况:
-
超时:当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
-
不可用:当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!
-
限流:防止上游服务请求太多导致服务崩溃,所以限制请求的数量,来达到保护下游服务的目的,当请求的流量到达一定阈值时,拒绝多余的请求,执行降级逻辑
看到这,相信你已经看到了一个相同点,就是以上三者(超时、不可用、限流)触发时,都会走同一个逻辑,那就是降级逻辑,在 Hystrix 里面叫做 Fallback;
![](https://img.haomeiwen.com/i2708793/1a10b206b9ddbd30.png)
熔断
什么是服务熔断呢?熔断很好理解,就是一个断开的过程。
服务熔断:当下游的服务因为某种原因变得不可用或响应过慢时,上游服务为了保证自身服务的可用性,不再继续调用下游服务,而是直接返回,快速释放资源。直到下游服务情况好转,则恢复调用。
熔断和降级的关系
降级 和 熔断 其实是服务安全中 2 个不同的流程,在下游服务发生故障时,肯定是先断开(熔断)与下游服务的连接,然后再执行降级逻辑;
![](https://img.haomeiwen.com/i2708793/9458bfcc1b8ca53d.png)
从实现上来说,熔断 和 降级应当是一起出现。因为当下游服务不可用时,上游服务就需要进入降级逻辑了。因此,熔断降级 是 降级方式的一种。
服务降级有很多种降级方式,如熔断降级、超时降级、限流降级。
超时降级:同样是 A 服务调用 B 服务,B 服务响应超过了 A 服务设定的阈值后,就会执行降级逻辑;
![](https://img.haomeiwen.com/i2708793/a05a1205f35fb09e.png)
限流降级:服务 A 的连接已超过自身能承载的最大连接数,比如说 A 能承载的连接数为 5,但是目前的并发有 6 个请求同时进行,前 5 请求能正常请求,最后一个会直接拒绝,执行 fallback 降级逻辑;
![](https://img.haomeiwen.com/i2708793/ddd28dbdd406f8f6.png)
网友评论