降级

上面的熔断,是为了在系统过载时不发生雪崩,限流是为了流量较大时,系统不发生过载。但是这两者都不会区分该服务是核心业务还是非核心业务。而降级,则是为了减少或者停掉一些非核心业务,来确保核心业务收到的影响最小。

为什么需要降级

  1. 降级机制能从全局角度对资源进行调配,通过牺牲非核心服务来保障核心服务的稳定性。降级是主动停掉一些非核心业务,而限流则是被动的将一些请求拒绝。
  2. 降级可以提高系统的用户体验性和可用性。在一些场景中,如果正常调用出现了非业务层错误后,我们可以不返回错误,而是执行接口的B计划,进行降级,虽然可能和正常流程不太一样,但是比直接返回错误要好。

如何实现降级

手动降级

手动降级是指在分布式系统中提前设置好降级开关,然后通过类似配置中心的集中式降级平 台,来管理降级开关的配置信息,在系统需要降级的时候,通过降级平台手动启动降级开关, 对系统进行降级处理。

该方案需要注意的是,往往服务有成千上百个,如果全部手动操作,则很麻烦。一个解决办法是:通过对降级分级,利用服务的等级信息和业务信息进行批量降级,比如一次直接把p1,p2,p3的服务全部降级。

自动降级

自动降级是指在分布式系统中,当系统的某些指标或者接口调用出现错误时,直接启动降级逻辑。一个降级的例子如下:

我们在网关中调用鉴权服务进行鉴权,每一 个调用鉴权服务的鉴权接口,需要执行如下的两个校验逻辑,不论哪一个失败,都会导致鉴权失败。

  1. 校验 Token 是否合法。
  2. 校验 UID 是否被管理员封禁。

在这个情况下,我们可以将 Token 设计为可以自校验的,在鉴权服务出现故障的时候,则启动降级逻辑,直接在网关中校验 Token 是否合法,如果合法就返回鉴权成功。

降级机制的关键问题

一般来 说,我们使用降级都是在系统已经出现过载的场景下,这时我们需要考虑,降级的配置信息是 否能正常下发。并且,降级通常会与熔断和限流一起出现,我们应该如何处理它们三者之间的关系。

配置信息下发的问题

对于熔断和限流来说,其阈值相关的配置信息在系统正常运行的时候,就已经下发到实例上了,所以在系统出现故障的时候,这些配置信息会直接生效。但是对于手动降级,我们需要在系统出问题时,通过降级平台下发配置来启动降级。

针对于配置无法正常下发的情况,我们可以考虑,由服务直接暴露出修改降级配置的 HTTP 接口,在必要的时候,可以手动通过 HTTP 接口,来启动服务的降级逻辑。

熔断、限流和降级之间的关系

首先,因为熔断机制是系统稳定性保障的最后一道防线,并且它是自适应的,所以我们应该在系统全局默认启用;

其次,限流是用来保障被限流服务稳定性的,一般在系统的核心链路和核心服务上,默认启用限流机制;

最后,降级是通过牺牲被降级的接口或者服务,来保障其他的接口和服务正常运行的,可以通过降级直接停用非核心服务,然后对于核心接口和服务,在必要的时候,可以提供一个“ B 计划”。

参考

《深入浅出分布式技术原理》