【图解秒杀系列】秒杀技术点------隔离、熔断、限流、降级
隔离
隔离的思想其实就是舱壁模式,这在Docker中有所体现。在Docker中,容器与容器间互相隔离互不影响。一个容器有它独立的与外界隔离的环境与资源,包括CPU、内存等,如果容器中的服务出问题,比如占用资源过高,也不会影响到别的容器中的服务。
我们的秒杀系统同样可以应用这种思想。秒杀系统的隔离是指单独部署一套秒杀服务,与常规的服务区分开,这样即使秒杀服务出了问题,原先的服务也不会受影响。
单独部署一套秒杀服务,看起来成本有点过高,但是现在是云计算时代,很多企业都在云上部署自己的服务,不像过去自己采购机器在物理机上部署服务。现在各云服务厂商都有相关的服务,比如阿里云有ECS和云容器服务,我们只要在上面租用相关的服务器即可。
而且在云上部署服务还有一个好处,就是弹性扩缩容的机制。当服务器压力过大时,可以通过弹性扩容动态地临时扩充服务器,以应对暂时地流量洪峰,等压力降下来之后,又可以自动缩容。
熔断
熔断机制可以有效保护我们的系统不会被一些异常服务拖垮。比如某些服务不可用或者响应超时,如果没有熔断措施的保护的话,就有可能造成服务雪崩。
当我们为我们的系统增加了熔断措施的保护之后,就可以保护调用方服务免受被调用方的不可用而导致自己也受影响。
熔断功能通过增加一个断路器实现。
断路器一般有三个状态:关闭、打开、半开。
- 关闭状态:如果一个开关处于闭合状态,此时接口可以执行正常的逻辑处理。
- 打开状态:如果一个开关处于打开状态,此时接口的所有请求都会被降级处理。
- 半开状态:处于半开状态的断路器,允许一个请求执行正常的逻辑处理,这相当于是试探性的调用一下,如果能正常返回结果,那么断路器恢复为闭合状态,否则变为打开状态。
断路器的三种状态间的转换如下图:
当断路器处于打开状态时,由于接口的正常逻辑无法执行,此时就是进行降级处理。
目前市面上的开源中间件中,Hystrix和Sentinel都有这样的功能。
限流
限流也叫流控,也就是流量控制,作用是限制流入服务接口的流量大小。每一个服务或接口能扛住的流量大小都是有上限的,如果超过了这个上限,就有可能造成性能下降或服务不可用。
限流通过在服务或接口前添加限流器实现。如果流量没有超过限流器的阈值,那么请求可以正常通过;如果流量超过限流器的阈值,那么超过阈值的这一部分请求就要被拦截掉。
被流控的请求,可以报错返回错误信息,也可以走降级处理的逻辑。
限流器的限流算法包括:
- 简单时间窗算法
- 滑动时间窗算法
- 漏桶算法
- 令牌桶算法
降级
当我们的系统经过层层优化之后,最终还是扛不住高并发的压力的话。可以考虑进行降级处理。
也就是说停掉我们系统中一些非核心服务,保证核心服务的正常运行,也就是丢车保帅。通过下线掉非核心服务,原先这些服务所占用的服务器资源(比如CPU、内存)等就可以腾出来,供核心服务使用。
这是服务级别的降级,还有接口级别的降级。
接口级别的降级是指,原有的逻辑无法正常执行,转而执行的一段备用的有损的逻辑。
比如服务A的接口调用服务B的接口发生异常或超时,那么服务A的接口进行降级逻辑,调用本地的一个方法,返回默认的数据。
除此以外,断路器打开,那么也会执行降级逻辑,而不会走正常逻辑。