每隔几年,一种编程语言就会跨越从”有趣的实验”到”严肃公司押注其基础设施的生产级工具”的门槛。Rust几年前就已跨越这一门槛,但2025和2026年标志着新阶段的到来:Rust不再是公司为了保持前沿而采用的语言。他们采用Rust是因为替代方案变得过于昂贵——在错误、性能上限和运营成本方面。
本文探讨了主要公司如何在生产环境中部署Rust,是什么驱动了他们的决策,他们在此过程中学到了什么,以及在什么情况下Rust可能不是正确的选择。
为什么公司选择Rust
Rust的卖点在理论上一直很有吸引力:无需垃圾回收的内存安全、零成本抽象、无畏的并发,以及与C和C++相媲美的性能。但公司采用Rust的实际原因往往比功能列表所暗示的更加具体和紧迫。
性能成本是真实存在的
对于大规模运营的公司来说,垃圾回收语言和系统语言之间的差异并非学术性的。它体现在AWS账单、尾部延迟百分比以及处理峰值流量所需的服务器数量上。当Discord将关键服务从Go重写为Rust时,他们消除了由Go的垃圾收集器引起的延迟峰值,这些问题一直困扰着他们的实时通信基础设施。
内存安全错误代价高昂
微软已公开表示,他们约70%的安全漏洞是内存安全问题。谷歌报告称Chromium也存在类似情况。对于维护大型C和C++代码库的组织来说,Rust提供了一种编写新组件的方法,这些组件对整个类别的漏洞具有免疫力——如释放后使用、缓冲区溢出、数据竞争——同时不会牺牲性能。
运营可靠性
Rust严格的类型系统和所有权模型能够在编译时捕获在其他语言中会表现为运行时错误的错误。对于需要持续运行并能优雅处理边缘情况的基础设施软件,这种编译时的严格性直接转化为运营可靠性。
案例研究:Rust在现实世界中的应用
Discord:驯服延迟
Discord采用Rust是最常被引用的案例研究之一,理由充分。他们的Read States服务跟踪数百万并发连接中用户已阅读的消息,最初是用Go编写的。该服务能够工作,但Go的垃圾收集器引入了周期性的延迟峰值,降低了用户体验。
在用 Rust 重写服务后,Discord 报告称平均延迟有所降低,尾部延迟变得可预测,并且服务消耗的资源更少。Rust 版本不仅避免了垃圾收集暂停——它在内存管理方面从根本上更加高效,从而提高了缓存利用率并降低了整体 CPU 使用率。
此后,Discord 已将其基础设施中的 Rust 使用范围扩大,包括实时消息处理和媒体处理管道。
Cloudflare:大规模边缘计算
Cloudflare 运营着全球最大的边缘网络之一,在全球 300 多个城市的数据中心中每秒处理数百万请求。在这个规模上,性能和内存效率不是优化选项,而是必要要求。
Cloudflare 已将 Rust 应用于多个关键系统,包括他们的 HTTP 代理框架(他们开源的 Pingora)、DNS 解析器以及 Workers 无服务器平台的组件。Pingora 替代了基于 Nginx 的基础设施,并处理了 Cloudflare 大部分 HTTP 流量。
工程团队指出,在网络代码中,恶意输入是持续存在的威胁,Rust 的内存安全保证尤其有价值。边缘代理中的一个内存安全错误可能会同时影响数百万个网站。
AWS:基础设施基础
Amazon Web Services 一直在稳步增加对 Rust 的投入。为 AWS Lambda 和 Fargate 提供支持的微虚拟机技术 Firecracker 完全用 Rust 编写。这一选择源于对最小化、安全且极快的虚拟化层的需求,在这种层中,每次冷启动时间的每一微秒都至关重要。
除了 Firecracker,AWS 还用 Rust 构建了 Bottlerocket(一个容器优化的 Linux 发行版),并通过 Tokio 异步运行时和 AWS SDK for Rust 为 Rust 生态系统做出了重大贡献。AWS 工程师已公开谈论 Rust 在减轻超大规模基础设施运行负担方面的作用。
Figma:协作渲染
Figma 的多人协作设计工具需要一个高性能的渲染引擎,该引擎既能在浏览器中运行(通过 WebAssembly),也能在原生平台上运行。他们的渲染引擎使用 Rust 编写,编译为 WebAssembly 用于网页,编译为原生代码用于桌面和移动设备。
这种方法使 Figma 能够在跨平台时保持一致的性能,同时为性能关键的渲染逻辑维护单一代码库。Rust 到 WebAssembly 的编译流程已经显著成熟,Figma 的成功证明了其在生产应用中的可行性。
Dropbox:文件同步引擎
Dropbox 用 Rust 重写了他们的文件同步引擎——这是他们最复杂且对性能敏感的组件之一。之前的 Python 实现在产品扩展以处理更大的文件集和更复杂的同步场景时已达到性能极限。
Rust 重写带来了一个更快、更节省内存的同步引擎,能够处理大得多的文件集而不会性能下降。Dropbox 工程师指出,Rust 的类型系统帮助他们比 Python 版本更精确地建模文件同步的复杂状态机。
有效的迁移策略
没有公司会一夜之间将所有内容都用 Rust 重写。成功的迁移有一些共同模式:
从独立且性能关键的组件开始
每个成功的 Rust 采用案例都始于一个具有明确性能或安全要求的特定组件。Discord 从一个服务开始,Cloudflare 从一个代理开始。试图同时将整个微服务架构迁移到 Rust 注定会失败。
使用 FFI 进行渐进式采用
Rust 的外部函数接口 (FFI) 能力使其可以与 C、C++、Python、Node.js 等语言互操作。许多团队通过编写一个从现有代码库调用的 Rust 库开始:
// 暴露 C 兼容函数的 Rust 库
#[no_mangle]
pub extern "C" fn process_data(input: *const u8, len: usize) -> i32 {
let data = unsafe { std::slice::from_raw_parts(input, len) };
// 从这里开始进行安全的 Rust 处理
match parse_and_validate(data) {
Ok(result) => result.status_code(),
Err(_) => -1,
}
}
这种方法让团队可以在不进行全面重写的情况下获得 Rust 经验。Rust 组件可以独立测试和部署,团队在处理更大的迁移之前可以建立信心。
投资工具和 CI
Rust 的工具链非常出色,但需要集成到现有的开发工作流程中。成功的团队早期就投资在 CI 管道中设置 Clippy(Rust 的 linter)、rustfmt(格式化工具)和 Miri(未定义行为检测器)。他们还设置了交叉编译和发布自动化,因为 Rust 的编译时间对于大型项目来说可能相当可观。
团队培训
关于采用 Rust 最常见的担忧是学习曲线。所有权系统、生命周期和借用检查器对大多数开发者来说确实是新概念,需要思维转变。
成功培训了团队的公司报告了几种模式:
- 让经验丰富的 Rust 开发者与新手结对。 代码审查是学习 Rust 最有效的工具。让新手感到沮丧的借用检查器错误通常有惯用的解决方案,有经验的开发者可以在上下文中解释。
- 从简单的部分开始。 并非每个 Rust 程序都需要生命周期或高级 trait 约束。CLI 工具、数据处理脚本和简单服务可以用直接的 Rust 编写,看起来几乎像是任何其他语言的更严格版本。
- 接受初期的生产力下降。 团队一致报告称,使用 Rust 的前两到三个月感觉比之前的语言要慢。在那之后,生产力会恢复并经常超过基线,因为通过编译的错误更少。
- 一开始可以自由使用
clone()。 与借用检查器争夺所有权是新手挫折的主要来源。克隆数据不是免费的,但它足够便宜,优化所有权模式可以等到团队更舒适时再进行。
何时 Rust 过于复杂
并非每个问题都需要 Rust,诚实的倡导者会告诉你何时使用它不合理:
- 快速原型设计。 如果你需要快速验证产品理念,Python 或 TypeScript 会让你更快进入市场。Rust 的编译时严格性是生产软件的一个特性,但对实验来说是一种负担。
- CRUD Web 应用程序。 如果你的服务主要是在数据库和 REST API 之间传输数据,Rust 与 Go、Java 甚至 Node.js 之间的性能差异可能并不重要。开发速度在这里更重要。
- 没有 Rust 经验的小团队。 培训投资是真实的。一个只有三个月开发时间的三人初创公司不应该花其中两个月的时间学习 Rust,除非其产品的核心价值主张需要其性能特性。
- 生态系统差距。 尽管 Rust 的生态系统已经显著成熟,但某些领域(机器学习、数据科学、某些企业集成)在 Python、Java 或 Go 中仍有更成熟的库。
2026 年的生态系统成熟度
Rust 生态系统已经达到了五年前难以预测的成熟度:
- 异步运行时: Tokio 经过实战检验,在生产环境中支撑了大量异步 Rust 应用。
- Web 框架: Axum 和 Actix Web 提供了可用于生产的 HTTP 服务器功能。
- 数据库访问: SQLx、Diesel 和 SeaORM 覆盖了大多数数据库交互模式。
- 序列化: Serde 仍然是任何语言中最好的序列化库之一。
- 云 SDK: AWS、Google Cloud 和 Azure 都提供了官方或维护良好的 Rust SDK。
- WebAssembly: Rust 的 WebAssembly 支持是所有语言中最成熟的,支持浏览器和边缘计算用例。
Rust 基金会持续投资于治理、关键 crate 的安全审计以及生态系统的长期可持续性。语言本身在 2021 版本中趋于稳定,2024 版本带来了改进,但没有破坏性变更。
互操作模式
对大多数组织而言,Rust 将与其他语言共存多年。最常见的互操作模式包括:
- gRPC 或 HTTP API 后的 Rust 服务: 最简单的集成方式。Rust 处理性能关键的服务;其他语言通过网络调用它。
- PyO3 用于 Python 集成: PyO3 使得用 Rust 编写 Python 扩展变得简单,让数据科学团队无需离开 Python 生态系统即可获得 Rust 的性能。
- Neon 用于 Node.js: 与 PyO3 类似,但面向 Node.js 生态系统,允许 JavaScript 应用调用 Rust 进行 CPU 密集型操作。
- WebAssembly 作为通用桥梁: 将 Rust 编译为 WebAssembly 并使用任何带有 WASM 运行时的语言调用它,是一种日益流行的模式,特别适用于可移植的业务逻辑。
结论
问题不再是 Rust 是否已准备好用于生产环境。它已经准备好了。问题在于您特定的领域、团队构成和组织约束是否使 Rust 成为您下一个项目的正确选择。
如果您正在构建性能关键的基础设施、面向网络的服务或内存安全错误会产生实质性后果的系统,Rust 应该是您评估清单的首选。如果您正在构建性能要求适中的标准 Web 应用程序,其他语言将以更少的初始投入为您提供良好的服务。
已经完成切换的公司报告了一致的模式:最初的几个月比较困难,随后生产事故显著减少,性能特性更好,代码库比被替代的代码更容易重构和维护。这种权衡越来越难以反驳。
