Sentinel流量控制&熔断降级
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:
三个角度
流量控制有以下几个角度:
• 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
• 运行指标,例如 QPS、线程池、系统负载等;
• 控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
1. 熔断降级简介
在调用系统的时候,调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积,熔断降级就可以解决这个问题,当检测到链路中某个资源出现不稳定的时候,则对这个资源进行限制,迅速地结束这个请求,避免影响到其他资源,导致级联故障
2.流量控制&熔断降级实现方案
主要有三种方案,分别是Hystrix,Resilience4j,Sentinel三种方案,下面主要以Sentinel方案来做介绍
Sentinel是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流,流量整形,熔断降级,系统负载保护等多个维度来保障微服务的稳定性
组成:
核心库:主要指java客户端,不依赖任何框架/库,能够运行于7及以上的版本的运行时环境
控制台:主要负责管理推送规则,监控,集群限流分配管理,机器发现等
特征:
丰富的应用场景,例如秒杀,消息削峰填谷,集群流量控制,实时熔断下游不可用应用等
完备的实时监控
广泛的开源生态
完善的SPI扩展点
使用
post 新建collection,新建request,新建test,使用runner运行测试
主页地址:https://github.com/alibaba/Sentinel/wiki



资源只被调用了6次,而不是20次
3.注意点
sentinel注意点
• spring-cloud-starter-alibaba-sentinel 将所有开放的端点自动视作sentinel所要保护的资源。
• 懒加载的,请求之后才能出现数据
• 规则默认是在应用(而非sentinel控制台)的内存中的,如果应用重启,则规则失效,后续通过扩展持久化
**
4.优势
1.友好的控制面板
2.支持实时监控
3.支持多种限流
4.支持多种降级模式
5.方便扩展开发
6.支持链路的关联,可以实现按照链路统计限流,系统保护,热门资源保护等
**
其他流控的选项
流控模式:
• 直接: 针对当前资源进行处理 /get
• 关联: A资源 关联 B 资源 ,请求发给B,如果达到阈值,那么则对A限流; A=>查询操作 B=>更新操作
• 链路:以调用链路为单位做限流处理,例如:A->B->C 这个链路的总体流量只按入口A的请求量来计算
流控效果:
• 快速失败:直接抛出异常,界面收到提示:Blocked by Sentinel (flow limiting) com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
• warm up(预热):如果qps 10,预热时长10s 冷加载因子是3 从qps=10/3 开始控制流量,逐步达到10
冷启动(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式。该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。
比如设置的阈值为100,预热时间10s,冷加载因子是3,那最初的阈值时100/3,逐步加大阈值,10s后达到100。阈值大小决定了流量大小,也就是逐步释放请求流量进入系统,让系统“冷启动”。参考官方wiki 限流—冷启动
源码: com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
熔断降级实现
熔断降级会在调用链路中某个资源出现状态不稳定的状态时,对这个资源的调用进行限制,让请求快速失效,避免影响到其他资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口内,对该资源的调用都自动熔断
熔断策略
平均响应时间(DEGRADE_GRADE_RT):当1秒内持续进入n个请求,对应时刻的平均响应时间超过阈值(毫秒),那么在接下来的时间内(秒)对这个方法的调用都会自动熔断
异常比例:当资源每秒请求量大于n(可配置),并且每秒异常占总量的比值超过阈值,进入降级状态,在接下来的时间之内,对这个方法的调用都会自动返回阈值范围[0.0]到[1.0],代表0%到100%
异常数:当资源近一分钟的异常数目超过阈值之后会进行熔断,统计时间是以分钟级别计算的,若timewindow小于60s,则结束熔断状态后,还会有可能再次进入熔断状态
熔断

异常比例: 单位时间内请求的异常与成功的比例 0-1(0%-100%)
时间窗口:熔断时间窗口30秒
隐含的条件:QPS默认为5
当qps达到5的前提下,计算异常比例,如果达到10%,执行熔断,不再往底层发送请求,30S过后,发送5笔请求,
如果结果为成功,则结束熔断,如果结果为失败,继续熔断30s