本文目录导读:

设置限流阈值没有绝对的“标准答案”,需要根据业务场景、系统容量、成本预算和用户体验综合权衡。
以下是一个系统化的设置方法论和常见策略,你可以参考:
第一步:明确限流的目标
首先问自己:我要保护什么?
- 保护后端: 防止数据库、微服务、缓存被打爆。(通常是最常见的)
- 保证公平: 防止某个恶意用户占满所有资源。
- 控制成本: 云资源或API调用是按量计费的(如OpenAI API,短信服务)。
- 平滑流量: 削峰填谷,让系统平稳运行。
第二步:评估系统容量(这是数学依据)
这是核心,你需要知道系统的极限吞吐能力。
- 压测: 这是最可靠的方法,通过压力测试工具(如JMeter, wrk, Locust)找出系统在可接受延迟下(例如P99延迟 < 200ms)的最大QPS或TPS。
- 压测发现单台服务器最多处理 500 QPS,超过后延迟飙升,那么单机阈值可设为 400 QPS(留20%缓冲)。
- 依赖容量: 如果系统依赖数据库,需考虑数据库连接池大小和查询耗时。
- 估算:连接池100个,每个查询平均20ms,最大QPS约 100 / 0.02 = 5000,阈值设为 4000。
- 历史峰值法: 观察过去半年或大促期间的流量峰值(双11、秒杀、活动)。
- 策略:阈值 = 历史最高峰 x 1.2 或 1.5 倍(视资源弹性而定)。
第三步:选择合适的限流维度
设置阈值时,要明确是针对谁的限制:
-
单机 vs 集群:
- 单机限流: 简单(如使用Sentinel单机模式),每个实例独立计算,适合服务均匀分布且无状态的情况,阈值通常按单机压测结果设置。
- 集群限流: 更准确(如使用Redis + Lua,或Sentinel集群模式),所有实例共享一个计数器,适合对总流量有严格上限的场景(如总库存有限)。
- 经验:对于大多数内部微服务,单机限流已经够用。
-
全局 vs 接口级:
- 全局: 保护整个网关或服务入口(如网关总QPS 10000)。
- 接口级: 保护具体热点API,因为不同接口的资源消耗不同。
- 登录接口(可能涉及加解密和数据库写)阈值可能只有 200 QPS;而查询接口(缓存命中)阈值可以是 5000 QPS。
-
用户级 vs IP级:
- 用户级: 防止单个用户刷单(如某用户每秒请求100次,则封禁或限流)。
- 策略:普通用户 5次/秒,VIP用户 20次/秒。
- IP级: 防止爬虫或DDoS(如某个IP请求量突然异常)。
- 用户级: 防止单个用户刷单(如某用户每秒请求100次,则封禁或限流)。
第四步:设定初始阈值(通用经验公式)
你可以从以下两个角度切入,并先设定一个保守值:
场景A:保护高可用的核心业务(如支付、下单)
- 策略: 极度保守。
- 方法: 压测得出的保证稳定的最大QPS的 70%。
- 压测极限1000 QPS报错,阈值设为 700 QPS。
场景B:保护成本敏感型资源(如AI API、短信验证码)
- 策略: 按预算反向推算。
- 方法:
- 预算:每月短信费上限1万元,单价0.1元/条。
- 总条数限制: 10万条/月。
- 平均到每秒:( \frac{100,000}{30 \times 24 \times 3600} \approx 0.04 ) 条/秒 → 实际上不可能这么低,需要另外设置突发限制。
- 实际设置: 单用户:3条/分钟,或系统全局:100条/分钟,以防止突发。
场景C:保障良好用户体验的API
- 策略: 按客户端合理请求频率设置。
- 方法: 正常的浏览器或APP操作,一般0.2秒/次(5次/秒)已经很快了。
- 常见阈值:
- 正常用户操作: 10 次/秒
- API接口(高级): 100 次/秒
- 数据抓取/爬虫: 立即触发限流
- 常见阈值:
第五步:动态调整与自适应算法
静态设置完之后,必须要监控和调整。
-
监控关键指标:
- 被限流的请求量: 如果限流日志显示被拦截的请求非常多,可能是阈值太低了或遇到了攻击。
- 系统CPU/内存/DB连接数: 如果没有被限流,但CPU飙到90%以上,说明阈值太高了。
- 错误率(5xx): 如果限流策略生效后错误率下降,说明阈值有用;如果错误率依然很高,说明阈值还需调低。
-
常用优化算法:
- 衰减因子: 新服务上线时,阈值从较低的保守值开始,随着运行稳定逐渐升高。
- 自适应限流(如 TCP 拥塞控制思想): 监控系统的实时负载(如CPU Load、RT),当负载低时,限流阈值自动调高;当负载高时,限流阈值自动降低,保持系统始终在最佳吞吐点附近。
- 预热(Warm Up): 对于连接池、缓存等需要冷启动的系统,刚启动时阈值很低,随着时间增加线性恢复到正常值,防止刚重启就被冲垮。
一个推荐的设置流程
- 压测定基线: 找出单机/集群稳定服务的容量上限。
- 留出余量: 上限 x 0.7(核心业务)或 x 0.9(非核心业务)。
- 分维度设置:
- 全局总入口(保护网关) -> 上面算出的总容量。
- 核心接口(保护DB) -> 单独压测后按 0.6 设置。
- 用户/IP级别(防止单点滥用) -> 正常行为频率 x 2 ~ 5 倍。
- 上线观察: 先开启限流日志(仅记录,不拒绝),看正常流量会不会被误拦。
- 灰度开启: 阈值从低到高,在流量低峰期(如凌晨)逐步调至目标值。
- 持续监控: 设置报警,如果限流命中率 > 5% 且业务没有明显请求量增长,可能是阈值过低;需要持续迭代。
一句话总结: 先通过压测找到上限,然后乘以一个安全系数(通常0.7-0.8),再按用户/接口/总流量分维度细化,最后开监控、留余量、上预警。