前面我们已经介绍了Sentinel的限流的简单使用,今天我们再次讲解Sentinel的限流与熔断的使用,并且介绍几种常见的限流的算法。 所谓限流就是通过限制并发访问数或者限制一个时间窗口内允许的请求数量来保护系统,一旦请求超过限制数量而采取一些处理策略,比如:跳转到错误页面、排队、降级等。限流以损失一部分用户的可用性而为大部分用户提供稳定的服务。本篇我们详细介绍Sentinel的限流的策略参数,如下我们复制上一篇中的示例代码:
private void initFlowRule() {
List<FlowRule> list = new ArrayList<FlowRule>();
FlowRule fr = new FlowRule();
fr.setResource("doSomeThing");
fr.setCount(10);
fr.setGrade(RuleConstant.FLOW_GRADE_QPS);
fr.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
fr.setClusterMode(false);
fr.setStrategy(RuleConstant.STRATEGY_CHAIN);
fr.setLimitApp("default");
list.add(fr);
FlowRuleManager.loadRules(list);
}
上面代码中setLimitApp()表示是否需要针对调用来源进行限流,默认为default,不区分调用来源;setStrategy()表示调用关系限流策略——包括直接、链路、关联三种模式;setControlBehavior()表示限流行为,包括直接拒绝、排队等候、慢启动模式、默认是直接拒接;setClusterMode()表示是否集群限流,默认为false。
在Sentinel限流模式中支持基于并发数的限流和基于QPS的限流模式,限流模式通过上面代码中的setGrade控制,(FLOW_GRADE_QPS,FLOW_GRADE_THREAD)。基于并发数的限流模式FLOW_GRADE_THREAD统计当前请求的上下文线程数,如果超出阈值,请求被直接拒绝来保护业务线程不被耗尽。基于QPS的表示当QPS每秒达到限流阈值时触发限流行为。
上面我们说过使用QPS策略时,如果达到限流阈值会触发限流行为,基于QPS的限流行为是通过setControlBehavior设置的,Sentinel提供了一下限流行为:
直接拒绝(CONTROL_BEHAVIOR_DEFAULT):直接拒绝模式是Sentinel默认的限流模式,也就是请求超过限流阈值时,直接抛出FlowException。
冷启动(CONTROL_BEHAVIOR_WARM_UP):该方式当流量突然增大时,能够放请求处理的数量逐步递增,在一个预期时间之后达到允许处理请求的最大值。
匀速排队(CONTROL_BEHAVIOR_RATE_LIMITER):该方式会严格控制请求通过的间隔时间,也就是让请求以均匀的速度通过。
冷启动+匀速排队(CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER) 两种方式结合实现限流行为。
Sentinel在熔断的操作上与限流类似,不同之处在于限流被包装为FlowRule,而熔断被包装为DegradeRule。代码示例如下:
private void initDegradeRule() {
List<DegradeRule> list = new ArrayList<DegradeRule>();
DegradeRule dr = new DegradeRule();
dr.setResource("doSomething");
dr.setCount(10);
dr.setGrade(RuleConstant.DEGRADE_GRADE_RT);
dr.setTimeWindow(10);
dr.setMinRequestAmount(5);
dr.setRtSlowRequestAmount(5);
list.add(dr);
DegradeRuleManager.loadRules(list);
}
上面代码中setGrade()表示设置熔断策略,目前Sentinel支持秒级RT、秒级异常比例和分钟级别异常数。
setTimeWindow:熔断降级的时间窗口,单位为秒,就是触发熔断多少秒内自动熔断
setMinRequestAmount:触发异常熔断的最小请求数,请求数小于该值,即使异常比例超出阈值,也不会触发熔断
setRtSlowRequestAmount:在RT策略下,1秒内持续多少个请求的平均时长超出阈值后触发熔断。
Sentinel提供了三种熔断策略:不同的策略,上面的参数也有所不同:
平均响应时间(RuleConstant.DEGRADE_GRADE_RT):如果1秒内持续进入5个请求,平均响应时长都超过了阈值count(毫秒),接下来的timeWindow时间内会触发熔断。
异常比例(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO):如果每秒的资源请求数大于minRequestAmount,并且每秒异常总数占总通过数的比例超过阈值count,资源进入降级状态,在接下来的timeWindow之内,调用该资源会触发熔断。
异常数(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT):当资源最近一分钟内的异常数目超过阈值之后,会触发熔断。如果timeWindow小于60秒,则结束熔断后仍然可能进入熔断状态。
本篇我们基本上介绍Sentinel限流和熔断的全部功能和策略,在项目中我们需要根据实际情况选择相应的策略,但是我们只是单独的介绍Sentinel的使用,下一篇我们会介绍Sentinel在Spring Cloud中的使用。