限流是网关侧最古老的职能,但「配一个 QPS 上限」和「设计一个限流体系」之间差着三层架构。这篇把三层设计的适用边界和典型坑过一遍。
单机限流的核心是算法选型,三个主流算法的脾气完全不同:
单机层的黄金法则:限流的 key 要选业务维度(用户 ID / API key),不要选 IP——公司出口 IP 几百人共享,按 IP 限流等于随机误伤。
多实例部署后单机限形同虚设(每台都放 N,总量 N×实例数)。分布式限流需要共享计数器,主流方案两种:
Redis 集中计数:Lua 脚本原子地「读-判-增」。优点精确,缺点是每个请求多一次 Redis 往返——限流组件自己成了延迟大户,且 Redis 抖动时代理全挂(限流系统要有「Redis 不可用时放行还是拒绝」的预案,通常选放行+告警,否则限流器变成单点故障源)。
本地分片配额:中心把总配额切成 N 份下发各实例,各自本地限。优点零额外延迟,缺点是不均衡(某实例流量热点时提前触顶而其他实例还有余量)。改进版是配额借用(实例间异步再平衡),复杂度上一个台阶。
实践建议:默认用本地分片(牺牲 10% 精度换零依赖),只有配额本身很贵(比如第三方 API 按次计费)才值得上 Redis 精确限。
限流不该只有一个阈值。成熟的设计是三级响应:
另一个容易被忽略的点:限流响应要可观测。被拒请求的数量、维度分布、重试风暴迹象,都要有指标——限流不是拒绝完就结束了,它是容量规划的数据输入。
三层设计一句话总结:算法层选对 key 和算法,协调层在精确性和依赖风险间取舍,策略层让限流从「一刀切拒绝」进化成「分级响应+数据回流」。限流系统的终极形态不是拦住流量,是告诉容量规划该扩容了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。