我们知道在分布式系统中,故障是不可避免的,所以我们需要设计一个高可用的系统,对于接口层面除了幂等&重试机制,还需要保证接口高可用,因此 限流&排队&降级&熔断也需要考虑。本篇主要介绍下接口故障下降级的处理机制。后面依序介绍其他三种。
为什么需要降级设计
降级设计,本质是为了解决资源不足和访问量过大的问题,当资源和访问量出现矛盾的时候,在有限资源的情况如何能够扛更多的流量,因此对于系统来说,我们需要对系统进行降级操作,系统一些不重要的系统,腾出一些资源保证系统平稳运行。
降级一般来说需要牺牲的主要如下
- 降低一致性,从强一致性变成最终一致性。
- 停止次要功能,停止访问不重要的功能,释放更多的资源
- 简化功能,比如数据不全返回,返回部分数据,或者假数据。
降低一致性
对于大多数的系统来说,并不需要保证强一致性,因为强一致性需要占用很多的资源,所以在遇到系统故障的时候,就需要从强一致到最终一致性,释放更多的资源。为了扛住更多的流量,一种通过降低数据一致性,另一种则是简化整体的处理流程。
使用异步简化流程
按照电商流程来说,为下单->支付->库存检查->发货。但是当系统请求量过高的时候,我们可以使用异步的方式,各个系统之间通过异步的方式进行通信,这样不需要等全部的流程结束之后在发货。因为整个流程中涉及到的系统,三方接口等同步方式下比较耗时,所以一般使用异步方式进行优化流程。
降低数据的一致性
数据一致性的话一般使用缓存,将高频的数据存储到缓存中间件,以此来提升数据读性能,但是可能会降级整体数据的一致性。降低数据库的压力,把数据库的资源交给更重要的业务,系统更快速地运行。
其实从缓存系统读取数据主要就是 命中(直接返回),失效(没有获取到,从DB查询 放入缓存中),更新(把数据更新到DB,然后缓存失效)
【性能设计篇】性能设计-缓存
降低次要的功能
停止次要功能,比如系统的积分系统,抽奖系统,支付系统可以设置为到付,先进行暂停,进行补偿一下用户。提示一下,或者补偿一下。
简化功能
比如返回的数据中,可以返回假数据或者少量的数据,对于一些非重要的功能,可以先进行关闭。释放更多的资源进行处理。
降级设计的要点
对于降级的处理,一般都是通过牺牲业务功能或者流程,以及数据一致性来解决的。所以我们需要梳理系统中的流程,很难做到不侵入业务方式做到降级。
降级的关键条件, 吞吐量过大,响应时间慢,失败次数过多,网络,服务故障等做好应急预案,最好是半自动化或者自动化的处理。
降级的时候,需要牺牲掉一致性,或是一些业务流程:对于读操作来说,使用缓存来解决,对于写操作来说,需要异步调用来解决。并且,我们需要以流水账的方式记录下来,这样方便对账,以免漏掉或是和正常的流程混淆。
小结
本篇主要介绍,为什么需要降级处理,以及降级处理的方式,一般都是通过功能、流程、一致性来解决。