一个页面上要发10个请求,该不该把后端打爆...

52 阅读4分钟

当你的项目用户暴涨,或者你自己写的小项目突然火了,用户量涨到几十万、几百万,一个页面10个请求也会被放大,导致出事,之前那种随手写的 API 调用方式,很可能:
👉 用户体验变差
👉 页面加载越来越慢
👉 系统整体变卡甚至崩掉

你以为是后端扛不住?
不!很多时候是 前端自己浪费了大量请求资源

所以,前端也要知道如何在“上百万请求”这种规模下去优化 API 调用方式。

下面我用最通俗易懂的方式,讲讲前端如何撑住大量请求不崩溃👇


1. 缓存,缓存,再缓存!这是前端的救命稻草

你要记住:
能不发请求,就不要发。

缓存分三种:

✔ 浏览器缓存

比如使用 Cache-Control 的方式,让浏览器自动帮你保存一些数据,下次访问页面时不必重新请求。

✔ 前端自己缓存

比如你拿到一个用户信息 userInfo,放到:

  • React 状态 / Redux
  • React Query / TanStack Query
  • localStorage/sessionStorage

这样就不会每次切换页面都重新请求一次。

✔ CDN 缓存

图片、CSS、JS 这种静态资源,不要让用户从后端源站拿。
CDN 节点全国都有,会快得多。

👉 记住一句话:

每一个不必要的请求,都是在把服务器一点点拖死。


2. 防抖 Debounce & 节流 Throttle:别自己把后端“DDoS”了

比如搜索框,用户一边打字一边请求,
那你等于把后端当敌人攻击。

防抖(Debounce)

等用户输入完 300–500ms 再发请求。
(适合搜索框)

节流(Throttle)

每隔 X 毫秒最多发一个。
(适合滚动加载、滚动监听等)

👉 你不做这些优化,后端真的会被你的前端“打爆”。


3. 批量请求(Batch Request)——50 个请求合成 1 个

你可能遇到这种情况:

多个 ID,要对每个 ID 请求一次接口。
于是你一口气发了 50 个请求。

更好的方式是:

✔ 让后端支持批量

一次请求传 50 个 ID,后端返回 50 条结果。

✔ 用 GraphQL

前端可以精准地要哪些数据,一次请求搞定。

记住:

50 个请求 ≠ 1 个请求
差别不是 50 倍,而是 爆炸性差别


4. 后台刷新,不要卡住整个页面

很多 APP 都是这样做的:

  1. 先展示旧数据,让页面马上能渲染
  2. 再在后台静默刷新最新内容
  3. 变化了再局部更新页面

Instagram、Twitter 都是这么干。

👉 这样页面不会“白屏”,用户体验会非常丝滑。


5. 优雅地失败,而不是“啪!全崩了”

大量请求 = 肯定会有失败。

遇到失败你不能直接:

  • 空白页
  • 无限 loading
  • 卡住不动

应该:

✔ 给用户看上一次成功的数据

(比如缓存)

✔ 告诉用户“出了点问题”,并给重试按钮

✔ 重试不要无限发,要用“指数退避”

比如延迟:

1s → 2s → 4s → 8s
越失败越慢,别给服务器补刀。

优秀的前端不是不出错,而是“出错也能优雅撑住”。


6. 要监控,不要瞎做

用这些工具看看真实用户的 API 情况:

  • Sentry
  • LogRocket
  • Datadog RUM

你可以看到:

  • 哪些接口最慢
  • 哪些错误最多
  • 哪些页面最容易挂掉

不监控,你永远不知道你的接口在用户手机上到底有没有炸。


7. 什么情况下你要反过来“怼一怼后端”?

如果一个页面需要发 10 个接口才能渲染,那肯定有问题。

这时要告诉后端:

  • 能不能给一个聚合接口?
  • 能不能一次性返回我需要的数据?
  • 能不能加缓存?
  • 能不能提升一下 rate limit?

前端不是“只能用接口的人”。
前端也可以推动后端设计更合理的 API。


🌟总结:百万请求不是后端的责任,是前后端共同的责任

当系统规模小的时候,你觉得这些优化没啥用;
但是当用户量涨到几十万、几百万的时候:

你写的每一行 fetch() 都可能被放大 1000000 倍。

所以要随时问自己:

“我这个请求真的是必须的吗?”
“有没有更聪明的方式减少浪费?”
“这个请求能缓存吗?”
“能不能合并?”

能撑住大量请求的前端,是懂架构的前端。