一个热点接口平时 1 万 QPS、峰值 20 万,你会把限流放在哪几层,阈值怎么确定?
我的判断
峰值 20 万 QPS 要在 CDN/网关、应用和依赖入口分层限流,阈值来自容量压测和业务优先级,并配合排队与降级。
边缘层先挡恶意和无效流量,按 IP、设备和账号做粗粒度限制;网关按接口、租户和活动令牌控制全局进入量;应用内部对数据库、Redis、第三方分别设并发上限。单纯在最里面限数据库连接已经太晚,前面的线程和队列会先耗尽。
阈值不按日常 1 万乘一个经验系数。我会通过压测找到在目标 P99 和错误率下的安全吞吐,例如应用 8 万 QPS、库存服务 5 万、数据库写入 1 万,再按最窄瓶颈和故障余量设置。不同业务分优先级,支付查询保留配额,推荐和装饰信息先降级。
算法上持续流量用令牌桶允许合理突发;昂贵资源再加信号量限制并发。被限请求返回明确错误和 Retry-After,客户端重试带抖动,不能同步整齐重试。
上线监控通过率、拒绝率、等待时间、各依赖利用率和业务成功量,并演练单依赖降容时阈值能否动态收紧。
思路拆解问题分析
限流目标不是把 QPS 卡成一个数字,而是 在最坏流量下仍让核心交易和依赖保持可恢复状态。所以阈值必须和延迟、队列及下游容量一起看。