谈阿里Sentinel流控组件(12.26)

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel
作为阿里巴巴“大中台、小前台”架构中的基础模块,覆盖了阿里的所有核心场景,也因此积累了大量的流量归整场景以及生产实践。
在过去的 10
多年里,阿里巴巴投入了集团大量的精英人力用于提升淘宝、天猫平台服务的稳定性,正是有了多年来上万名阿里技术人才的持续创新和技术沉淀,在一系列秒杀大促中,特别是双11
这样现象级的电商大促中,才打造出了今天大家所看到的可轻松应对双11的平台稳定性体系,包括限流和降级、流量调度、业务开关、容量压测和评估、全链路压测、业务一致性平台等,而Sentinel正是在这种背景下产生的限流降级框架,目前已接入集团几乎所有的核心应用。

对于Sentinel组件可以实现限流,熔断降级,塑性,系统负载保护四个关键功能。

➤ 限流

当我们设计了一个函数,准备上线,这时候这个函数会消耗一些资源,处理上限是1秒服务3000个QPS,但如果实际情况遇到高于3000的QPS该如何解决呢?Sentinel提供了两种流量统计方式,一种是统计并发线程数,另外一种则是统计
QPS,当并发线程数超出某个设定的阀值,新的请求会被立即拒绝,当QPS超出某个设定的阀值,系统可以通过直接拒绝、冷启动、匀速器三种方式来应对,从而起流量控制的作用。

➤ 熔断降级:

接触过Spring Cloud、Service
Mesh的同学,都知道熔断降级的概念。服务之间会有相互依赖关系,例如服务A做到了1秒上万个QPS,但这时候服务B并无法满足1秒上万个QPS,那么如何保证服务A在高频调用服务B时,服务B仍能正常工作呢?一种比较常见的情况是,服务A调用服务B时,服务B因无法满足高频调用出现响应时间过长的情况,导致服务A也出现响应过长的情况,进而产生连锁反应影响整个依赖链上的所有应用,这时候就需要熔断和降级的方法。Sentinel通过并发线程数进行限制和响应时间对资源进行降级两种手段来对服务进行熔断或降级。

➤ 塑形

通常我们遇到的流量具有随机性、不规则、不受控的特点,但系统的处理能力往往是有限的,我们需要根据系统的处理能力对流量进行塑形,即规则化,从而根据我们的需要来处理流量。Sentinel通过资源的调用关系、运行指标、控制的效果三个维度来对流量进行控制,开发者可以自行灵活组合,从而达到理想的效果。

1. 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
2. 运行指标,例如 QPS、线程池、系统负载等;
3. 控制的效果,例如直接限流、冷启动、排队等。

➤ 系统负载保护

平时系统运行都没问题,但遇到大促的时候,发现机器的load非常高,这时候对系统的负载保护就显得非常重要,以防止雪崩。Sentinel
提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。需要注意的是,Sentinel在系统负载保护方面的判断机制是根据系统能够处理的请求,和允许进来的请求,来做平衡,而不是根据一个间接的指标(系统load)来做限流。因为我们最终追求的目标是在系统不被拖垮的情况下,提高系统的吞吐率,而不是load一定要到低于某个阀值。