流控规则
流量控制
官网:https://github.com/alibaba/Sentinel/wiki/流量控制
1. 基本介绍
- 资源名:唯一名称,默认请求路径
- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源)
- 阈值类型/单机阈值:
- QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流。
- 线程数:当调用该api的线程数达到阈值的时候,进行限流
- 是否集群:不需要集群
- 流控模式:
- 直接: api达到限流条件时,直接限流
- 关联:当关联的资源达到阈值时,就限流自己
- 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
- 流控效果:
- 快速失败:直接失败,抛异常
- Warm Up(预热):根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
- 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。
2. 流控模式
2.1 直接
默认模式,到达QPS或线程数直接限流,给出默认的错误提示页面。
线程数指的是用于处理请求的线程个数,当设置阈值的线程数不足以处理目前的请求时就会限流。
线程数阈值就相当于银行坐台的工作人员,最多有几个,当所有工作人员都被占用了,此时还有请求要进行处理时就会进行限流。
2.2 关联
A接口关联了B接口,当B接口的调用达到限流条件时,A接口就被限流了
场景:下订单接口关联了支付接口,当支付接口的调用达到限流条件时,下订单接口就被限流了
通过Apifox对testB接口进行压测
参考:https://blog.csdn.net/run_boy_2022/article/details/130134823
发现A接口被限流。
3. 流控效果
3.1 快速失败
默认的流控效果,直接抛出错误页面。
源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
3.2 Warm Up
-
理论
Warm Up(
RuleConstant.CONTROL_BEHAVIOR_WARM_UP
)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。 -
源码:
com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
-
使用
按照如上设置,流控规则是这样的:QPS的初始值为阈值(10)/冷加载因子(默认为3)的值开始,在预热时长(5秒)内达到我们设置的阈值(10),也就是QPS的阈值会在5秒内从3逐渐达到10。
-
应用场景
如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。
3.3 匀速排队
-
理论
匀速排队(
RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER
)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。 这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
-
源码:
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
-
使用