限流问题

场景

用户量继续增长,我发现了一些异常情况。

问题发现

某天,服务器响应突然变慢。

我查了一下监控,发现:

Top 10 用户(最近 1 小时)

User 123 15,000 次/小时
User 456 800 次/小时
User 789 600 次/小时
User 101 500 次/小时

User 123 在 1 小时内调用了 15000 次!

平均每秒:15000 / 3600 ≈ 4.2 次

这个用户在疯狂调用 API,影响了其他用户。

问题分析

我查看了这个用户的使用情况:

切换到查询模式,可以看到统计查询的执行意图和结果。

特征:

  • 24 小时不间断调用
  • 每小时约 1000-1500 次
  • 很有规律的调用模式

结论:这是一个自动化程序!

影响

这个用户的疯狂调用对系统的影响:

1. 性能影响

正常情况:
- QPS(每秒请求数):5
- 平均响应时间:50ms
- 服务器 CPU 使用率:30%

User 123 加入后:
- QPS:10(翻倍)
- 平均响应时间:150ms(变慢 3 倍)
- 服务器 CPU 使用率:70%

2. 资源占用

User 123 占用资源:
- 外部 API 调用量:5%(15000/300000)
- 服务器 CPU 时间:30%
- 数据库连接:常驻 1-2 个

更糟糕的是:
- 挤占了正常用户的资源
- 影响了整体用户体验

3. 不公平

正常用户:
- 每天 100 次调用
- 按套餐付费

User 123:
- 每天 36000 次调用
- 同样的套餐

这不公平!

限流目标

我决定实现限流机制

限流目标

  1. 保护系统稳定性
  2. 保证公平性
  3. 区分不同套餐

限流策略

套餐每日限额每秒限额突发限额
免费版1000 次1 次/秒10 次
基础版10000 次10 次/秒100 次
专业版100000 次100 次/秒1000 次

练习

练习 1

如果 User 123 是一个正常付费用户,只是在做批量任务,你还会直接封禁他吗?你会怎样设计限流规则,既保护系统,又尽量不误伤用户?

参考答案 (3 个标签)
限流 公平性 用户体验

不应该一上来就封禁。更好的做法是把“恶意”和“高频正常使用”分开处理。

可以这样设计:

  1. 按套餐设置基础限额:免费版、基础版、专业版有不同的每日限额和每秒限额。
  2. 允许短时间突发:用突发额度处理批量任务,避免用户偶尔集中调用就被拦住。
  3. 超过阈值先降速:先返回限流提示和剩余额度,而不是直接封号。
  4. 异常行为再风控:如果出现大量错误参数、撞库式请求、绕过认证等行为,再进入封禁或人工审核。

验证时要看被限流请求里是否有正常业务场景。如果正常用户频繁被拦,说明阈值或突发额度设计得太保守。

当前架构