第 11 章 · 限流第 1 页,共 9 页
为什么要限制别人请求的次数?
晚饭高峰时,一个抓取脚本就能让百家菜的普通读者打不开页面。这一页看它怎样挤占服务器,限流怎样把它挡在门外,以及限流管不了的情况。
为什么需要
抢票时接连点了几次刷新,页面上出现一行字:「请求过于频繁,请稍后再试」。这就是被限流了。你平时听说的「平台给内容限流」,指平台少推荐某些内容,与本章讲的不是一回事。本章的(rate limiting)是规定一个请求者在一段时间里最多能发多少个(手机或电脑发给网站的一条消息),超出的部分被拒绝或推迟。
百家菜是本课程虚构的家常菜谱网站,背后是一台一直开着、专门等别人来要菜谱的电脑,叫作(server);它每秒最多能处理多少个请求,叫作(capacity)。一天晚饭前,有人用抓取脚本(自动反复请求网页、把内容存下来的小程序)飞快地搬走全部菜谱。服务器忙着应付脚本,普通读者的请求只好排队,等久了页面就打不开。送来的工作超过了能处理的量,叫作。这并不少见:维基百科背后的维基媒体基金会发现,自动程序只占页面浏览的约 35%,却占了最耗服务器资源的请求的至少 65%(2025)。
在下图里调高脚本的速度,看服务器怎样被挤满;再打开限流。图里模拟 30 秒。「普通读者」这个框代表许多人,每人只发几个请求,合计平均每秒 60 个;一个请求排队 3 秒还没开始处理,就算失败。
一个抓取脚本挤满了百家菜的服务器
先看这里先看「百家菜服务器」框底部的负载条:它表示送来的工作占服务器能力的几成,满了就是过载;旁边是 30 秒结束时还在排队的个数,播放完才显示。把脚本调到「每秒 60 个」,负载条满了,读者的请求开始失败;再打开限流,看负载条回落。
- 送达
- 被拒绝,退回时带着 429:服务器答复「请求过多」(第 8 页细讲)
- 排队等太久,失败了
- 一个点代表一批请求,N 是这一批的个数
这 30 秒里,服务器有 61% 的时间在忙;普通读者的请求平均等了 0.01 秒,0% 失败。
怎样做
限流分四步:认出请求来自谁,查这个请求者最近发了多少,判断有没有超出上限,然后放行或拒绝。被拒绝的请求就地退回,带回一条「请求过多」的(服务器发回的消息)。做这件事的(系统里负责一件事的部分,图上的每个框都是一个组件)叫作(rate limiter),站在服务器前面的入口处。
规则里规定的那个数,比如本章用的「每 12 秒最多 8 个」,叫作上限;按这条规则分给某一个请求者的那一份,叫作它的(quota)。限流保护的有四样:
- 服务器的能力:不让一个抓取脚本挤满服务器(上图)。
- 公平:智能厨具公司在自己的 App 里展示百家菜的菜谱,它的程序出错后不停地重复请求。每个请求者只有自己的一份配额,它用完了,别人照样分得到服务器的能力。
- 花费:百家菜每发一条登录验证码短信都要付钱。给「发验证码」单独设上限,脚本再怎么点,账单也涨不上去。人工智能公司 Anthropic 的文档也说,它设上限的用意之一是减少使用者无意中花掉的费用(文档未注明日期)。
- 账号安全:限制一个账号短时间里能试几次密码,乱猜的人就很难猜中(第 7 页)。
限流器要放在百家菜自己这一边。App 和网页里的程序运行在别人的设备上,可以被改掉或绕过;在 robots.txt 文件里写「请不要抓取」也不够,互联网标准 RFC 9309 说明,这只是请抓取程序遵守的规则,不是访问授权(2022)。只有在服务器一侧执行的限流才算数。
代价是什么
限流也有代价。第一,可能误伤:许多人共用一个对外的 (网络上用来找到一台设备的一串数字)时,会被当成同一个请求者(第 7 页)。第二,每个请求都要多查一次计数(第 9 页)。第三,上限要定得合适,太松拦不住,太紧会拒绝正常用户。在线支付公司 Stripe 先让新的限流器只记录、不拦截地试运行,看它会拒绝哪些请求,再调整上限、正式启用(2017)。
还有两种情况,按请求者计数的限流帮不上忙。在图上切换到「成千上万个请求者」:攻击者操纵大量设备,每台只发几个请求,谁都没有超出上限,加在一起却压垮了服务器,这叫(DDoS)。替网站抵御攻击的 Cloudflare 公司记录到,2025 年 12 月的一场攻击活动最多时每秒有 2.05 亿个请求。再切换到「所有人同时涌来」:热门烹饪课晚上八点开放报名,几千位读者同时点进来,每人只发几个请求。
这两种情况要靠别的办法:服务器快要过载时主动拒绝一部分请求、保住已经接下的工作,叫(第 12 章细讲);让访问者先在等候页面排队,再按服务器承受得了的速度放进去,叫。2022 年 11 月,票务公司 Ticketmaster 的一场演唱会预售收到了以往峰值 4 倍的请求,它用邀请码、排队和候补名单控制进入的人数(2022)。
资料来源
以下资料均于 2026-10-19 访问。