在 Sentinel 中,流控策略(Flow Control Strategy)用于定义如何处理请求的流量,并决定在流量达到某个阈值时采取的行动。流控策略是实现系统稳定性和高可用性的核心机制,尤其在高并发环境中,确保服务不会因过载而崩溃。
Sentinel 提供了多种流控策略,可以灵活应对不同的业务场景和流量控制需求。
1. 流控策略类型
1.1 QPS(请求数)流控
流控策略:QPS(Queries Per Second)流控是最常见的一种流量控制方式,它限制某个资源在单位时间内(如每秒钟)能够承载的请求数量。
使用场景:适用于对请求频率敏感的接口,如查询接口、登录接口等。
配置:
FlowRule.setGrade(RuleConstant.FLOW_GRADE_QPS)
1.2 并发线程数流控
流控策略:并发线程数流控(Concurrency Control)是基于并发线程数来控制流量。当某个接口的并发线程数达到限制时,新的请求将被拒绝或排队。
使用场景:适用于某些有严格线程资源限制的场景,例如数据库连接池、缓存系统等。
配置:
FlowRule.setGrade(RuleConstant.FLOW_GRADE_THREAD)
2. 流控行为(Control Behavior)
在流控达到阈值时,Sentinel 提供了不同的流控行为来决定如何处理请求。流控行为指的是请求达到限流条件后,系统应该采取什么策略来处理后续请求。
2.1 直接拒绝(Reject)
描述:当请求流量超过了限流阈值时,直接拒绝该请求,并返回 限流异常。
使用场景:适用于对系统要求严格,任何额外请求都不能被处理的场景,例如高负载下的关键业务接口。
配置:
FlowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_REJECT)
2.2 Warm Up(预热)
描述:采用预热策略时,系统会在短时间内逐步允许一定数量的请求,以便系统能够平稳过渡到高并发状态。当流量急剧增大时,通过控制请求的“冲击”程度,避免系统在高并发下崩溃。
使用场景:适用于流量波动较大的接口,尤其是流量暴增时。
配置:
FlowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)
2.3 排队等待(Queueing)
描述:当请求超过流控阈值时,将请求放入队列中进行排队,直到有资源空闲时再处理请求。队列的大小和等待时间可以进行设置。
使用场景:适用于希望请求被延迟处理而不是立即拒绝的场景,减少请求丢失,增加请求的容错性。
配置:
FlowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_QUEUE)
2.4 直接放行(Allow)
描述:当达到流量控制阈值时,允许请求通过。即使达到流控阈值,仍然继续处理请求。
使用场景:通常用于进行性能测试或开发阶段,想要尽可能不受流量限制地处理请求。
配置:
FlowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_ALLOW)
(不推荐用于生产环境)
3. 流控规则配置
一个完整的流控规则通常包含以下配置:
资源名(resource):指定要进行流控的资源名,通常是接口或方法。
流控模式(grade):指定流控的模式,可以是 QPS 或并发线程数。
流量阈值(count):指定最大请求数量或最大并发线程数。
流控策略(controlBehavior):指定当达到流控阈值时采取的流控行为。
应用标识(limitApp):指定该流控规则适用于哪些应用,可以使用应用名称或其他标识来区分不同来源的流量。
4. 流控策略示例
4.1 基于 QPS 的流控
java
复制编辑
FlowRule rule = new FlowRule(); rule.setResource("queryUserById"); // 限流的接口或资源名 rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 使用 QPS 流控 rule.setCount(100); // 每秒最多 100 次请求 rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_REJECT); // 超过 QPS 限制时拒绝请求 FlowRuleManager.loadRules(Collections.singletonList(rule)); // 加载规则
4.2 基于线程数的流控
FlowRule rule = new FlowRule(); rule.setResource("processOrder"); // 限流的接口或资源名 rule.setGrade(RuleConstant.FLOW_GRADE_THREAD); // 使用线程数流控 rule.setCount(50); // 最多允许 50 个并发线程 rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_QUEUE); // 超过线程数限制时排队等待 FlowRuleManager.loadRules(Collections.singletonList(rule)); // 加载规则
4.3 结合预热策略和队列策略
FlowRule rule = new FlowRule(); rule.setResource("paymentService"); // 限流的接口或资源名 rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 使用 QPS 流控 rule.setCount(200); // 每秒最多 200 次请求 rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); // 使用预热策略 FlowRuleManager.loadRules(Collections.singletonList(rule)); // 加载规则
5. 总结
在 Sentinel 中,流控策略是保证服务在高并发情况下仍能稳定运行的关键。通过灵活配置流控策略,可以有效地控制流量、保护关键接口、提高系统的弹性。
QPS 流控:适用于控制请求频率。
并发线程数流控:适用于控制并发数,防止线程池耗尽。
流控行为:包括拒绝、排队等待、预热等,可以根据业务场景选择适当的策略。