为什么高并发普遍用 Java 不用 C++,C#,Rust 或 Go?

1 阅读5分钟

阿里用 Java,美团用 Java,拼多多用 Java,字节的高并发服务用 Go 但交易链路也有大量 Java。C++ 明明更快,Rust 性能更猛,这帮公司的架构师不懂吗?都懂。但高并发要解决的问题跟"谁跑得快"关系不大。

瓶颈不在 CPU

C++ 处理单个请求确实快。CPU 密集型任务上,C++ 比 Java 快是常态,没有 GC 停顿、内存布局可以精确控制。

但高并发场景下,瓶颈几乎不在 CPU 上。

一个典型的后端接口:收到 HTTP 请求 → 解析参数 → 查数据库 → 查缓存 → 拼装结果 → 返回响应。整个过程里 CPU 真正在算东西的时间可能不到 1 毫秒,剩下的 19 毫秒全在等——等数据库返回、等 Redis 返回、等下游服务响应。

CPU 快不快,在这种 IO 密集型场景里影响极小。瓶颈在于:这 19 毫秒的等待期间,线程/协程是不是被阻塞了?系统能不能把这段空闲时间让给别的请求用?

Java 用 NIO + Netty 可以做到一个线程处理几千个连接。Go 的 goroutine 更夸张,一个进程里跑几十万个协程,每个才几 KB 内存。两个语言在"同时保持大量连接"这件事上,跟 C++ 比没有劣势——甚至因为语言层面的支持更好,写起来更简单。

C++ 当然也能做到,epoll + 自己写事件循环,性能确实最好。但开发成本也最高——手动管理内存、手动管理连接生命周期、手动处理异步回调地狱。写出来的代码,能维护它的人跟能写它的人一样稀缺。

高并发系统的真实成本结构

高并发系统上线之后,服务器成本占一部分,但大头是人力。开发、测试、排查线上问题、加功能、改需求——这些事情占了项目生命周期里 80% 以上的成本。

Java 写一个微服务,Spring Boot 脚手架生成,Starter 引入中间件,MyBatis 写 SQL,部署到 K8s。一个普通 Java 后端半天就能搭起来。新人来了,看 Spring 的注解和分层结构,一两周就能上手改代码。出了线上问题,Arthas 在线诊断、Skywalking 链路追踪、ELK 查日志——工具链成熟到你不需要自己造轮子。

C++ 写同样的微服务,光 HTTP 框架就得挑半天,连接池、序列化、日志、监控、配置中心全得自己集成。招一个能写出生产级 C++ 后端的人,比招三个 Java 开发都难。

Rust 的情况好一些,Actix-web 和 Tokio 生态在成长,但跟 Spring 生态的深度比还差了几年的积累。招 Rust 工程师的难度跟 C++ 差不多——会写 Rust 的人不少,能在生产环境里维护 Rust 高并发服务的人很少。

Go 才是正经对手

Go 跟 C++、Rust 放在一起比不太公平,定位完全不同。Go 就是冲着"用最少的复杂度写高并发后端"来的。

goroutine 轻量到可以随便开几十万个,channel 做通信,标准库的 net/http 直接能扛生产流量。Docker、Kubernetes、etcd、Prometheus——云原生基础设施大半都是 Go 写的。字节跳动大量后端服务从 Python 迁到了 Go,B 站的很多服务底层也是 Go。

但 B 站上搜"高并发",出来的内容九成是 Java。这不是因为 Java 做高并发更好,是存量效应。中国互联网的后端系统,主流技术栈在 2010-2018 年定型的。那个时期 Go 还不成熟(Go 1.0 是 2012 年才发布的),能选的就是 Java 或者 C++。Java 开发效率远高于 C++,于是阿里、美团、京东、拼多多这些公司的核心交易系统几乎全是 Java。

这些系统一旦建好了,就不会因为"Go 写并发更简单"而重写。上亿行 Java 代码、几千个 Java 微服务、几万名 Java 工程师——迁移成本不是技术问题,是组织问题。

新项目的选择已经在变了。云原生方向选 Go 的越来越多,对延迟极度敏感的基础设施组件选 Rust 的也在增加。

但企业级后端的主力短期内还是 Java。Java 21 的虚拟线程(Project Loom)已经把协程能力补上了——百万级并发,Java 现在也能做到,Go 在这一点上的优势被削弱了不少。

C# 的情况比较可惜。技术上 C# 跟 Java 非常像——有 GC、有 async/await、ASP.NET Core 在 TechEmpower 基准测试里排名比 Spring Boot 还靠前。但微软早期把 .NET 绑在 Windows 上,等 .NET Core 开源跨平台的时候(2016 年),国内互联网公司的技术栈早就定型了。C# 做高并发完全没问题,纯粹是没赶上那个窗口。

招人才是最贵的并发瓶颈

Rust 写高并发性能确实碾压 Java。但在国内招五个能写生产级 Rust 后端的工程师,花的时间可能比把系统用 Java 写完还长。Spring Cloud 那套服务治理在 Rust 生态里没有对等物,得自己一块一块拼。

C++ 性能天花板最高,但用 C++ 写的高并发系统往往跟写它的人深度绑定。核心开发一走,满屏的自定义内存分配器和手写事件循环,新人接手的第一反应通常不是维护,是评估用 Java 重写的成本。