Skip to content

Next.js 高级架构

Next.js 如何设计限流、配额和滥用防护?

IP 限流只能挡住部分流量,生产系统还要按用户、租户、接口成本、并发和业务额度分层治理。

适合阶段:资深全栈 / 稳定性面核心能力:Rate Limit · Quota · Abuse

面试官想考什么

  • 为什么只按 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 仍然很贵?

  • 考察点:限流位置。
  • 回答方向:限流发生在调用模型之后就晚了,应在成本动作前检查配额和并发。

推荐阅读

基于 MIT 协议开源