返回知识库

数据与服务 · 账号与安全

限流Rate Limit

限流给一个 key 在时间窗口内设请求上限,超限回 429 + Retry-After,让客户端退避等而不是猛重试;登录按 IP + 账号双键限流是防撞库的标配。

限流窗口观察台:填满窗口,亲手触发 429

限流给一个 key 在时间窗口内设请求上限,超限回 429 + Retry-After。在这里连续点发送,看计数物件填满、第 6 次撞 429、快进窗口后恢复;切 key 维度看 per-IP 与 per-account 的区别。

POST /login 为例,窗口上限 5 次 / 60 秒。点主操作「发送 POST /login5 次填满计数;第 6 次起每点必回 429。切 key 维度与调用方,看计数物件按当前 key 重算。

key 维度
调用方按 IP 时两人共用同一 IP 桶
当前 key:ip=10.0.0.40 / 5
还可发 5 次请求
请求日志(按发送倒序,最多 7 条)每行带当时的 key
  1. 还没有请求。点「发送 POST /login」开始填窗口;连续点到第 6 次看 429。

原因:当前 key ip=10.0.0.4 还没消费请求。下一步:点「发送 POST /login」开始填窗口,连续到第 6 次会回 429。对照:换 key 维度或调用方,计数器会按新 key 重算——这就是 per-key 计数。

提示:Tab 在各按钮间移动,Enter / 空格触发。重点试三组对照:连点 5 次填满 → 第 6 次看 429;在 429 态再点 CTA = 重试被拒,点「快进」窗口归零;按 IP 模式把 Alice 填满后切 Bob,看两人共用同一桶;按账号模式切 Bob,是独立的 0/5

观察台暴露的限流规则

面板把每次请求的结果演给你看了,这里命名清楚,并补无法直接操作的部分。

  • 限流 = key + 窗口 + 上限:选一个 key(IP / 账号 / token / API key),在一个时间窗口内数它的请求数,超过上限就拒绝;面板里计数物件就是这个计数器的具象。
  • 超限回 429 + Retry-After:HTTP 429 Too Many Requests 告诉客户端「你发太快了」,Retry-After 告诉它什么时候能再试;面板第 6 次起的红色请求行就是这个响应。
  • Retry-After 期间不忙重试:在窗口结束前重试只会被立即拒绝、不消耗计数;客户端应读 Retry-After 退避,并配合幂等键重试,避免重试风暴。
  • key 维度决定「谁被一起算」:按 IP 限流时一个 NAT / 办公网后所有人共用一个桶(一个人刷爆、全楼登录被锁);按账号限流时只锁那一个账号(更精准防撞库,但用户换设备 / IP 仍受限)。
  • 计数器放快存里,不放数据库:每个请求都要读—改—写计数,DB 扛不住;通常用 Redis 的 INCR + EXPIRE 做窗口计数,主库只管业务数据。
  • 固定窗口边界会突发:固定窗口在两个窗口交界处可放过近 2 倍上限(前窗末尾 + 后窗开头);滑动窗口 / 令牌桶更平滑——这层差异放正反例里讲。

什么时候上限流,什么时候换别的

从「这个接口会不会被刷爆或拖垮」出发,而不是所有接口都套同一个限流。

  • 必须限流:登录、注册、找回密码、短信 / 邮件验证码、搜索、导出、计费接口——成本高或可被滥用;登录按 IP + 账号双键限流是防撞库的标配。
  • 按身份分桶配额:免费用户紧、付费用户松;机器对机器用 API key 单独配额;内部服务之间走白名单或独立通道,不和终端用户抢额度。
  • 不要用限流替代鉴权:限流挡「发太快」,不挡「没权限」;该拒绝的请求要在鉴权层就拒,别让限流成为唯一的门。
  • 健康检查 / 监控要走例外:否则一次正常压测或监控探针可能把自己限流,造成假告警;给白名单或独立配额。

从一次请求到 429:最短路径

一次能跑通的窗口限流,只走这几步。

  1. 中间件 / 网关收到请求,按规则算 key(如 ip=10.0.0.4user=alice),通常组合 route + method + key
  2. 在 Redis 用 INCR key 取当前窗口计数;第一次 INCREXPIRE key 60 秒 设窗口 TTL——这就是一个固定窗口。
  3. 计数 ≤ 上限放行到业务逻辑;计数 > 上限直接回 429,加 Retry-After: <剩余秒> 和可读 message,不让客户端忙循环。
  4. 客户端读 Retry-After 做指数退避重试;重试请求带幂等键,确保就算多次送达也只生效一次。
  5. 把 key、允许 / 拒绝次数、Retry-After 写进指标;仪表盘区分真实滥用、客户端重试风暴和误伤。

同一份登录限流:防撞库,还是误伤用户

只改一处关键选择,结果差很多。这是限流设计里最该记住的一组对照。

正例:IP + 账号双键、429 带可读文案与 Retry-After、客户端指数退避重试INCR login:ip:10.0.0.4 / login:user:alice,各 5/60 秒;超限 429 + Retry-After

登录接口同时按 IP 和账号计数:同 IP 多账号猛试撞库被 IP 桶挡,单账号多 IP 撞库被账号桶挡;429 附 Retry-After 与「请稍后再试」文案,客户端指数退避 + 幂等键重试、不忙循环;健康检查走白名单。

反例:全站一个桶、429 不带 Retry-After、前端立即重试全站每分钟 1000 次,超限 429 无 Retry-After;前端 setInterval 每 200ms 重试登录

全站一个桶意味着任何一个流行接口刷爆,所有接口(含登录)一起 429;没有 Retry-After,客户端只能盲猜、往往立即重试,形成重试风暴放大流量;登录前端每 200ms 重试更直接把限流打成 DoS。

快速自测

登录接口按 IP 限流 5 次/分钟,一个办公网(同一出口 IP)里 50 个人正常登录,最可能出现什么?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。