Sentinel 实现 QPS(每秒查询率)流量控制的核心原理和流程如下:
-
规则定义:
- Sentinel 提供了 FlowRule 来定义流量控制规则,其中包含了资源名、限流阈值(QPS)、统计窗口长度、控制行为等信息。
-
数据结构:
- 为了高效地统计 QPS,Sentinel 使用了高性能的数据结构
LeapArray
。这是一个滑动窗口实现,内部维护了一个环形数组以及一个指针来跟踪当前窗口,可以快速计算出指定时间窗口内的请求次数。
- 为了高效地统计 QPS,Sentinel 使用了高性能的数据结构
-
统计模块:
- 当请求到达时,首先会经过 Sentinel 的责任链中的
StatisticSlot
模块。 StatisticSlot
在接收到每个请求后,会调用相应的计数方法增加对应资源的请求数量,并通过LeapArray
结构对这些请求数量进行时间窗口内的统计。
- 当请求到达时,首先会经过 Sentinel 的责任链中的
-
流控判断:
- 请求继续传递到
FlowSlot
模块,在这里 Sentinel 根据之前统计模块得到的统计数据,与预设的 QPS 流控规则进行比较。 - 如果在给定的时间窗口内,该资源的请求次数超过了设置的阈值,则触发相应的限流动作(如直接拒绝、Warm Up 等策略)。
- 请求继续传递到
-
动态调整与更新:
- Sentinel 支持动态加载和更新规则,当规则发生变化时,会通过
FlowRuleManager
更新内存中的规则集,并通知相关的组件刷新统计和流控状态。
- Sentinel 支持动态加载和更新规则,当规则发生变化时,会通过
-
监控上报:
- 统计数据不仅用于实时流控决策,还会被定期上报至 Sentinel 控制台,以便于观察和管理系统的流量状况。
综上所述,Sentinel 通过对每个资源基于时间窗口进行精确的请求计数,并将此统计结果与预先配置的 QPS 流控规则对比,从而实现了 QPS 流量控制功能。整个过程涉及到了高效的滑动窗口算法、灵活的规则管理和响应式的流控决策机制。