Sentinel 的 QPS 是按每个整秒清零吗?线程数限流和 QPS 限流差在哪?为什么我的异常比例熔断永远不触发?请求间隔大了为什么也不熔断?被拦的接口返回什么?这篇用 sentinel-core 1.8.9 和 Spring Cloud Alibaba Sentinel 逐项实测。
t=0 瞬间连发 20 次:5 通过 / 15 被拦 过了 0.6 秒再发 5 次:0 通过 / 5 被拦(第一批 5 个还在最近 1 秒的窗口里) 再过 0.6 秒(距第一批 1.2 秒)再发 5 次:5 通过 / 0 被拦
最近 1 秒的滑动窗口。
6 个线程同时进入、每个占用 300 ms:3 通过 / 3 被拦
限制并发而不是每秒请求数。
6 个并发请求的结果(时间从放行开始算起):[7 ms 通过, 9 ms 被拦, 9 ms 被拦, 23 ms 被拦, 212 ms 通过, 408 ms 通过]
每 1000/count 毫秒放行一个,排队超过上限被拦。
第 1~5 秒各通过:[21, 14, 20, 30, 30]
冷启动时阈值逐渐升到 count。
慢调用比例(RT>100 ms 算慢,阈值 0.5,最少 5 个请求,窗口 1 秒,熔断 2 秒):连续 10 次每次睡 150 ms → 慢慢慢慢慢慢拦拦拦拦,真正执行了 6 次 等 2.2 秒后连续 3 次快调用(第 1 个是探测):通过(快)通过(快)通过(快) 异常比例 0.5、最少 5 个请求:10 次抛异常,没有调用 Tracer.trace → 错错错错错错错错错错,真正执行了 10 次 同样 10 次抛异常(换一个新资源),catch 里调用 Tracer.trace(x) → 错错错错错拦拦拦拦拦,真正执行了 5 次 6 次抛异常(调用了 Tracer.trace)但每次间隔 400 ms(共 2.4 秒,每个 1 秒窗口里不到 5 个请求)→ 错错错错错错,真正执行了 6 次
慢调用比例、异常比例(要 Tracer.trace)、统计窗口与最少请求数。
瞬间连发 5 次 GET /hello → [200, 200, 429, 429, 429];被拦的响应体 = 'Blocked by Sentinel (flow limiting)' 瞬间连发 5 次 GET /ann(@SentinelResource + blockHandler)→ [200, 200, 200, 200, 200];其中响应体是 blockHandler 返回的有 3 个:'blockHandler 收到 FlowException'
Web 默认 429;blockHandler 返回 200。