Sentinel滑动窗口通过LeapArray实现精准限流,解决固定窗口临界统计失真问题;默认1秒分2格(500ms),支持配置更高精度;结合QPS预热、排队等待与系统自适应规则实现动态限流降级。

Sentinel 的滑动窗口算法(基于 LeapArray 实现)是实现精准、低延迟限流的关键,它能有效应对突发流量,避免传统固定窗口的临界问题,同时为平滑降级提供实时、细粒度的指标支撑。
滑动窗口如何解决突发流量下的统计失真
固定窗口在时间边界处会出现“突刺”式计数归零,导致同一秒内前几毫秒涌入大量请求被放行,后几毫秒却因窗口重置而误拒。Sentinel 默认采用 1 秒划分为 2 个样本(即滑动步长 500ms),每个样本独立统计,窗口总时长始终为 1 秒——通过加权滑动聚合,保证任意连续 1 秒内的请求数都可被准确估算。
你可以在初始化规则时显式配置:
new IntervalWindowLeapArray(2, 1000) 表示每 1000ms 切分 2 个格子,每个格子 500ms;若需更高精度(如抗毛刺更强),可设为 (10, 1000)(即 100ms 粒度),但注意内存与性能平衡。
结合 QPS 滑动窗口做自适应限流
核心接口建议使用 QPS 匀速排队(WarmUpFlowController)或预热并发(WarmUpRateLimiter),而非简单拒绝。例如:
- 设置 阈值 100 QPS,预热期 60 秒:系统启动或低负载后,允许缓慢提升通过率,避免冷启动击穿
- 启用 排队等待模式(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER):超出阈值的请求进入队列,按固定间隔(如 10ms/个)匀速放行,实现“削峰填谷”
- 配合 系统自适应规则(SystemRule),当 CPU > 80% 或平均 RT > 200ms 时自动下调接口 QPS 阈值,形成双重保护
用滑动窗口指标驱动降级决策
降级不应仅依赖异常比例静态阈值,而应结合滑动窗口内实时统计:
- 每 1 秒采集当前窗口的 异常数 / 总请求数,滚动计算最近 3 个窗口(3 秒)的加权异常率
- 当连续 2 个窗口异常率 > 50%,且 RT 中位数上升 300%,触发 自动熔断(DegradeRule 设置 timeWindow=60,statIntervalMs=1000)
- 熔断期间,所有新请求直接走 fallback 方法;恢复期采用半开状态——允许少量探针请求,成功则关闭熔断,失败则重置计时
生产环境关键调优点
默认配置在高并发下可能不准或抖动,需针对性调整:
- 增大样本数:高频核心接口(如支付下单)建议设为 (20, 1000),降低窗口跳跃感
- 禁用异步统计:确保 MetricsRepository 使用同步写入(如 ConcurrentHashMap + AtomicLong),避免指标滞后影响降级判断
- 隔离统计维度:对多租户或渠道来源的接口,用 SphU.entry(resourceName, EntryType.IN, 1, "tenantId=xxx") 带参数埋点,实现分维度滑动窗口统计
- 监控窗口健康度:定期检查 LeapArray.currentWindow() 是否频繁创建新窗口(说明时间漂移或 GC 影响),可通过 JVM 参数 -XX:+UseParallelGC 减少 STW

















