如何理解服务容错

144 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 13 天,点击查看活动详情

服务容错就是降级和熔断嘛,实际上容错的概念我们还可以把它扩展的更宽一些,那还能扩展到什么维度呢?在介绍这个话题之前,我们先来了解一下什么是服务容错。

对外策略是防范可能性的发生。在微服务领域当中,我们会运用哪种技术手段,一般选择流量控制。

 限流:对于流控,一般的做法是限流。实际上在流控领域中,限流只是一个最粗粒度、最笼统的概念。限流的判定标准实际上也是相对比较简单的,如果达到阈值,就把流量限制,没有达到就不限流。

  流量整形:但是在限流之后,还有一个更细腻的手段,即流量整形。流量整形可以应用在很多不同的维度,比如,单机当前机器的流量整形方案,分布式的集群统一应用的流量整形方案,以及流量整形所想要达到的流控的效果,被整形的流量是让它去排队,还是让它快速失败,还是让它做预热等等,这些都是不同的流控效果。

 阈值类型:限流和流控在同一个层次维度有一个阈值类型,就是什么样的阈值下触发了什么样的数值,才会触发对应的限流和流控。常用的两个手段:QPS 和线程数。QPS:可以直接反映你服务器端访问压力的数值。线程数:对于同一个服务来说,我们通常在一些关键的主链路上面,也不只是设置一种类型的阈值,我们会使用多种限流和流量整形的方案一同作用,即使是同一个接口,也会有这种交叉火力覆盖的场景。

 

流控模式:流控模式和流控效果这两个非常容易混淆,实际上是不一样的。那流控效果是最终想要达到整形效果。但是流控模式这里可不一样,流控模式将要去定义的效果,通过什么样的形式来触发。比如流量整形是直接作用于当前资源或者是作用于整个调用链路,以及设置一些关联流量,识别出流量的关联方等等。

以上这些就是阿里系在很多年的超高并发应用开发过程当中总结出来的一些最佳实践。与此同时,它的核心链路组件 Sentinel 也是在使用这样的方式定义自己的流控策略,在后面的章节里在详细的介绍它的功能。

在对内治理:异常啊往往已经发生了,那么是要尽可能的从这个异常当中恢复出来。如何实现呢?很简单,通过降级熔断。

不同的服务容错框架对降级和熔断之间的处理是不一样,有的框架在降级阶段并不会做什么实质性的动作。有的框架在降级阶段可以去执行一个特定的降级方法。这是每个框架根据自己的能力不同,所做出的不同的实现。

但是降级和熔断之间的关系,在我们的微服务领域的各种容错框架当中,它们之间的相互依赖关系是一样的。也就是当前熔断是由什么来触发的?熔断实际上就是由一些失败的请求来触发的,你每一次的失败请求都有可能去触发一个服务的降级。那么当你在一段时间内有一个时间窗口,在这段窗口当中,如果你的服务持续失败,或者你的服务失败率达到了一个既定的阈值标准。比如设置了 50%在这个窗口统计时间内,50% 的服务调用全部都失败掉了。那么这时候我们会把当前的服务调用打入到一个熔断的机制当中。

对应的熔断策略就是用来设置当前降级熔断的这个触发条件。比如可以设置你的慢调用它的指标,超过 500ms,此时可以认为是一个慢调用,所有请求当中慢调用的比例达到一定数值,触发熔断掉。异常调用,如果超过 50% 的异常调用触发熔断。可以根据异常调用数量,例如在十秒钟之内侦测到异常调用数量超过 100 个,那么这时候进入一个熔断状态。

熔断实际上就是禁止当前方法的执行和方法调用。这样一来,实际上可以有效的防止服务雪崩,比如服务因为压力原因导致响应开始变慢,或者导致获得 503 之类的这种异常的情况,导致整体的错误率开始往上升的时候,触发对应的熔断条件,关掉之间服务链路的调用关系,减低下游服务的这种压力。进而可以防止服务雪崩的发生,把当前服务调用的错误,给限定在一定的范围之内。所以熔断降级就像一个结界,当发生这种异常的时候,我可以展开一个结界,把你这个异常控制在我这个结界之内,不要向外去扩张。