当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:快速失败(直接拒绝)、Warm Up(预热)、匀速排队(排队等待)。对应 FlowRule 中的 controlBehavior 字段。
快速失败
(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。
Warm Up(预热)
比如说你的应用在启动的时候你需要把大量的一些用户数据或者商品数据加载到redis缓存数据里面去,你不可能一部到位直接让所有的外部流量直接访问接口,你需要有一个缓冲的过程,这个加载过程是梯形上升的.
我们的sentinel支持预热的场景, 比如说你来了100个请求,然后sentinel先允许通过30个请求,剩下70个请求直接拒绝掉,这样防止应用直接崩溃,然后假设设置了5秒,等到5秒之后,你来了100个请求,sentinel就允许通过100个请求.
这样就是有个缓冲的过程,避免大量的流量直接给你系统打垮
Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过”冷启动”,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
冷加载因子: codeFactor 默认是3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。
通常冷启动的过程系统允许通过的 QPS 曲线如下图所示
测试用例
@RequestMapping("/test")
public String test() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "========test()========";
}
编辑流控规则
默认的加载因子是3(3是sentinel底层代码设置的,你可以改代码去调整的),单机阈值设置了10之后,预热时长设置5
刚开始的时候只允许每秒处理3个请求,然后5秒之后阈值就会每秒处理10个请求.
jmeter测试
查看实时监控,可以看到通过QPS存在缓慢增加的过程(绿色曲线图在缓缓往上升)
匀速排队
匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER
)方式会严格控制请求通过的间隔时
间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
该方式的作用如下图所示:
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求
到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
注意缺陷:匀速排队模式暂时不支持 QPS > 1000 的场景。 因为一秒最大也就是1000毫秒,1000毫秒最多分给1000个请求去执行,也就是1个请求至少需要1毫秒去执行
单机阈值设置为5代表每秒就执行五个请求,超时时间就代表超过这个时间就抛弃掉.
因为你单机阈值设置为5之后,假如说来了1000个请求过来,此时你肯定是忙不过来的,那么没有来得及处理的请求,等待超时超过了 超时时间 这里设置的500ms后,直接就拒绝请求了.
jemeter压测
查看实时监控,可以看到通过QPS为5,没有超过5的,体现了匀速排队效果