Spring Alibaba Sentinel 流量控制详解

流量控制详解

流量控制,其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性

同一个资源可以创建多条限流规则,FlowSlot会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource:资源名,即限流规则的作用对象
  • count: 限流阈值
  • grade: 限流阈值类型(QPS 或并发线程数)
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
  • strategy: 调用关系限流策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

基于QPS/并发数的流量控制

流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS。类型由FlowRulegrade字段来定义。其中,0代表根据并发数量来限流,1代表根据 QPS 来进行流量控制

并发线程数控制

并发数控制用于保护业务线程池不被慢调用耗尽,这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的overhead比较大,特别是对低延时的调用有比较大的影响

// 案例
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule1 = new FlowRule();
// 设置限制规则的资源名称
rule1.setResource("methodA");
// 限制对资源'methodA'并发访问20个线程
rule1.setCount(20);
// 使用并发现场线程限制
rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);
// 规则使用的来源
rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);

QPS流量控制

当 QPS 超过某个阈值的时候,则采取措施进行流量控制,流量控制的效果包括以下几种:直接拒绝、Warm Up、匀速排队,对应 FlowRule 中的 controlBehavior 字段

若使用除了直接拒绝之外的流量控制效果,则调用关系限流策略(strategy)会被忽略

直接拒绝

直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException

Warm Up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式,通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限

匀速排队

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,例如阈值QPS=2时,每个500ms处理一个请求,假设当前有10个请求则需要排队处理5秒

你可能感兴趣的:(JAVA)