一个 HTTP 请求的并发链路:从 Web Server 到 MySQL

一个 HTTP 请求的并发链路:从 Web Server 到 MySQL 前面的文章分别讨论了并发是什么、进程线程协程如何执行请求、IO 多路复用如何管理大量连接,以及如何用 QPS、并发数和响应时间衡量系统。 但这些概念真正进入后端系统之后,会形成一条完整的链路: Client ↓ Web Server / Nginx ↓ Application ↓ Process / Thread / Coroutine ↓ Redis / RPC / MySQL ↓ Response ↓ Client 真正的高并发问题,通常也不是发生在某一个组件上,而是发生在整个链路的容量不匹配上。 例如: Web Server 可以接收 10000 个连接,应用可以运行 1000 个协程,但 MySQL 连接池只有 50 个连接。 这并不意味着系统只能处理 50 个 HTTP 请求,但意味着同时进行数据库操作的请求最多受到这 50 个连接的约束。 因此,理解高并发,不能只看 Web Server 或应用服务器,而要沿着一次请求完整地看下去。 1. 一个 HTTP 请求到底经过哪些组件? 假设用户访问: GET /api/orders/10001 一个典型后端系统可能经过: ┌──────────┐ │ Client │ └────┬─────┘ │ HTTP ▼ ┌──────────────┐ │ Nginx / Web │ │ Server │ └──────┬───────┘ │ ▼ ┌──────────────────┐ │ Application │ │ Hyperf / Java....

2024年07月10日 · 5 min · Leanku