在 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 流控:適用于控制請求頻率。
-
并發線程數流控:適用于控制并發數,防止線程池耗盡。
-
流控行為:包括拒絕、排隊等待、預熱等,可以根據業務場景選擇適當的策略。