字节跳动引入Rust(比如Volo RPC框架、飞书部分服务重构、Go2Rust迁移实践等),并不完全代表“Java的缺点Go也没解决”,而是更接近于:在字节的特定高性能、极致成本优化场景下,Rust比Go又多解决了一些Go没完全搞定的痛点。
我们把三者的主要问题和字节的实际选型逻辑拆开看:
| 维度 | Java (GC + JVM) | Go | Rust | 字节实际观察/选择倾向 |
|---|---|---|---|---|
| 内存占用 | 高(GC对象多、老年代大) | 中低 | 极低(无GC,手动管理但安全) | Rust显著胜出 |
| CPU/性能峰值 | 中等(JIT后不错,但有GC暂停) | 高(但goroutine调度有开销) | 最高(零成本抽象+极致优化) | Rust > Go > Java |
| 尾延迟p99/p999 | 较差(GC暂停、JIT warmup) | 好,但深度优化后仍有瓶颈 | 极好(无GC、无运行时抖动) | Rust最稳 |
| 开发/迭代速度 | 快(生态最全) | 最快(简单语法+超快编译) | 慢(borrow checker学习曲线陡) | Go仍为主力 |
| 安全性(内存安全) | 好(无野指针) | 好(无野指针) | 最好(编译期严格保证) | Rust胜出 |
| 极致场景优化难度 | 难(JVM黑盒多) | 中等(逃逸分析、GC调优有限) | 相对容易(LLVM + 细粒度控制) | Rust最有空间 |
| 字节内部大规模现状 | 仍然海量存量 | Kitex、Breeze等主力框架 | Volo、部分核心服务迁移中 | Go为主 + Rust补充 |
字节引入Rust的主要真实驱动(来自他们公开分享和内部实践总结):
- 极致成本优化(最核心原因)
在相同QPS下,Rust服务CPU核耗能比Go低20–50%,比Java低更多 → 每年省机器、省电费能到亿级人民币体量。 - 尾延迟和抖动控制
Go在高负载下调度器、GC、逃逸分析仍有极限;Rust几乎没有这些运行时干扰,p999延迟更可预测。 - 零拷贝 + 极致网络/序列化性能
Rust在协议栈、零拷贝、自定义内存分配器上有天然优势,字节某些feed推荐、短视频分发链路对这部分特别敏感。 - Go已经很好,但还有“再上一层楼”的空间
Go已经帮字节把大量Java服务替换掉了(性能翻倍+开发快),但当业务继续追求“再省30%机器”“再把p999压缩一半”时,Go开始显得“优化空间见顶”,Rust就成了下一把钥匙。
所以更准确的说法是:
- Java的很多经典缺点(高内存、GC抖动、启动慢)→ Go已经解决得非常好了(字节自己就是最大例证之一)
- 但在字节这种“千亿DAU、体量极大、要榨干每一颗核”的公司里,Go也还有没完全解决的最后一公里(主要是极致延迟、极致资源利用率、深度定制能力)
- Rust就是在解决这“最后一公里”
一句话总结:
字节引入Rust不是因为“Go不行”,而是因为Go已经干掉了Java的大部分脏活累活,Rust现在来干掉Go的最后一点“不够极致”。这是典型的大厂规模效应下的语言选型演进,而不是哪门语言“全面碾压”了另外两门。
你怎么看?是觉得字节太卷了,还是觉得Rust确实有可能在服务端成为下一个主流?