你选了那门大家口中“快到起飞”的语言。然后你亲眼看着延迟曲线,长出了牙齿。
而在每一次 Review 里,你还是得回答同一个问题:怎么又慢了?
那个把我们骗得很开心的微基准测试
在选语言之前,我们做了所有“成熟团队都会做的事”。
同一个接口。
同一份 payload。
同一台机器。
同一种压测模式。
流程也很克制:
解析一个不大的 JSON 请求体,
查一次缓存,
未命中就查一次数据库,
返回一个精简响应。
不是什么玩具 Demo,但足够干净。结果很漂亮。
Rust 像超级英雄一样冲在最前面。
Go 稳定、克制、可预测。
Node 看起来像是“为了交付速度而不是 CPU 速度”存在的选项。
我们当时觉得自己非常理性:热路径,就该用最快的工具。 毕竟要扛大流量,谁不想要“原始性能”呢?
这个信念,一直持续到服务遇到真实流量。
百万请求之后,世界变了
当规模上来之后,一个接口就不再只是接口。
它会变成:
- 挂在数据库连接池前面的队列
- 那个你在乐观时写下的重试策略
- 在 staging 里几乎没成本、但在 prod 里要命的监控和日志
- 那个偶尔慢一下,就会让所有调用者“礼貌排队”的下游依赖
当我们一天的请求量跨过 100 万,图表突然就不再尊重我们的微基准测试了。
p50 依然很好看。
p95 给了我们一种虚假的安全感。
p99 成了每天的争吵来源。
延迟的形状变了。
不再是平滑的曲线。
而是:平静、平静、平静,
然后突然一根尖刺,
像是系统被人捏了一把。

那一刻,我们学到了一条后端工程里最烦人的真理:
快,不是语言特性。
快,是系统拒绝排队。
我们无法忽视的记分板
我们重新跑了一次压测。
这一次,不再只看“好看”的指标。我们盯的是那些 线上真的会让你失眠的东西:
结果如下,同一个 API,同样的流量模型:
技术栈 p50 p95 p99 峰值 RPS 重试风暴下的错误率
Node 8ms 38ms 170ms 18k 0.3%
Go 6ms 30ms 240ms 22k 0.6%
Rust 4ms 22ms 410ms 26k 1.1%
Rust 赢了“天气晴朗”的比赛。
但在系统开始混乱时,Rust 的尾巴最难看。
Node 不是最快的。
Node 是在混乱中最冷静的。
这个结果,说实话,很反直觉。
时间到底花去哪了?
当 p99 爆掉的时候,我们第一反应当然是:是不是代码慢了?
结果几乎没找到什么慢代码。
服务并不是在“做事”。它是在 等。
后来我们开始长期跟踪三个指标,比任何火焰图都诚实:
- Queue Depth
- 数据库连接池等待时间
- Retry Rate
规律非常清晰:
Retry Rate 一上来,Queue Depth 紧跟着涨。
Queue Depth 一涨,Db Pool Wait 立刻出现。
然后 p99 直接起飞。
handler 本身再高效,也没用。
如果你盯着延迟图表看过,并且心脏下沉过,你一定知道接下来会发生什么。
你修的不是某一个请求。你修的是压力的形状。
“最快的那个”是怎么输的
下游服务稍微慢了一点点。
不是宕机。
不是灾难。
只是慢到刚好触发部分超时。
然后——重试开始了。
重试本来是为了保护系统的。结果成了放大器。
Rust 非常听话。它疯狂地吞吐请求,也疯狂地扩大了冲击半径。请求开始堆积。队列开始变长。数据库连接池等待成了真正的延迟来源。p99 从一个数字,变成了一种情绪。
最扎心的地方在于:Rust 没有做错任何事。
错的是我们的自信。
我们把 handler 打磨得像跑车,却给它配了一个没有刹车系统的底盘。
Go 表现得更好,但也不完美
Go 稳一些。
但在突发流量下,GC 压力还是会在 p99 里留下节奏感。
不是每次。不是持续的。但总会在你最不想看到的时候冒出来。
真正的反转:Node
Node 没赢性能。
Node 赢在:不容易把系统搞化。
它自带的“摩擦力”像一个软限流器:
- 它逼你更早面对背压
- 它让你不敢随便开很大的并发
- 它让你开始尊重队列深度
- 它让服务变得……无聊
而在百万请求级别,无聊,是一种美德。
那张我们反复画的图
这张图,在每一次事故复盘里都会出现:
Client
|
v
API
|
+--> Parse JSON
|
+--> Cache (Hit)
| |
| v
| Return
|
+--> Db Pool (Miss)
|
v
Downstream
|
v
Return
p99 死在这里:
- 数据库连接池等待
- 重试风暴
- 队列深度
- 日志与监控的反压
一旦你接受了这张图,语言之争就会突然安静下来。因为瓶颈几乎从来不在语法里。瓶颈在 等待。
我真希望更早明白的结论
Rust 是一把手术刀。
Go 是一把锋利、可靠的厨房刀。
Node.js 是一把更多人能安全使用的工具刀。
选你团队 最擅长控制压力、塑造流量、快速修复 的那一把。
因为在百万请求面前,赢家不是那门单点最快的语言。而是那门语言,能帮你在世界失控时,让 p99 保持冷静。