主题
Next.js 高级架构
Next.js 如何设计限流、配额和滥用防护?
IP 限流只能挡住部分流量,生产系统还要按用户、租户、接口成本、并发和业务额度分层治理。
面试官想考什么
- 为什么只按 IP 限流不够? 考察攻击面。
- Edge 和应用层如何分工? 考察限流位置。
- 多实例计数放内存可以吗? 考察分布式一致性。
- 限流后用户看到什么? 考察恢复和降级。
一句话回答
text
在 CDN/Edge 做粗粒度流量保护,在 Route Handler/领域层按用户、租户、接口成本和并发做精细限流与配额;计数使用共享原子存储或网关能力,返回 Retry-After,并对高成本任务采用队列和预算。面试回答详解
1. 分层策略
text
WAF/CDN IP -> Proxy route -> API key/user/tenant
-> concurrency/cost quota -> domain action不同层解决不同问题:DDoS、爬虫、账号滥用、模型成本和业务公平性不能用一个 bucket 解决。
2. 维度选择
- IP:匿名流量的粗保护,容易被 NAT 和代理影响。
- 用户/租户:登录业务公平性和计费。
- 路由/动作:登录、搜索、AI 生成的成本不同。
- 并发:防止长请求占满连接和 worker。
- Token/费用:AI 场景的真实预算。
3. 计数和一致性
多实例内存计数会失真。使用网关、Redis 等共享原子计数,设置窗口、滑动窗口或令牌桶;接受最终一致时要明确超发边界。
4. 用户体验
返回明确错误码、Retry-After、剩余配额和恢复时间;前端保留输入和草稿,不自动高频重试。低风险请求可以降级,高成本请求进入排队。
5. 绕过与观测
设备指纹、代理 IP、账号注册、并发连接和异常行为可能组合攻击。记录限流维度、策略版本、命中原因和误杀反馈,但不要记录完整凭证。
可直接背诵的 30 秒回答
text
限流要分层:CDN/WAF 挡 IP 和攻击流量,Proxy 或网关做粗粒度路由保护,Route Handler 和领域层按用户、租户、接口成本、并发和 token 预算做精细控制。多实例不能只用内存计数,应用要返回 Retry-After 和可恢复状态,高成本任务用队列和预算。扩展知识
限流与熔断
- 限流:控制进入系统的请求量。
- 熔断:下游故障时快速拒绝,避免级联放大。
- 配额:按时间和业务维度控制可用资源。
面试官追问链
追问一:IP 从哪个 header 取?
- 考察点:代理信任。
- 回答方向:只信任受控代理注入的地址,不能直接信任用户自带的 X-Forwarded-For。
追问二:Redis 挂了是否放行?
- 考察点:fail-open/fail-closed。
- 回答方向:按接口风险决定;登录、支付和高成本 AI 可能 fail-closed 或进入低额度模式,普通页面可有限 fail-open 并告警。
追问三:为什么返回 429 仍然很贵?
- 考察点:限流位置。
- 回答方向:限流发生在调用模型之后就晚了,应在成本动作前检查配额和并发。