Facebook 应用 Rust 简史

编辑整理:张汉东

原文: https://engineering.fb.com/2021/04/29/developer-tools/rust/


Facebook正在拥抱Rust,这是当今最受喜爱和增长最快的编程语言之一。 除了为其Rust团队带来新的人才外,Facebook还宣布将正式加入非营利组织Rust Foundation。 与Mozilla(Rust的创建者),AWS,Microsoft和Google、华为 等成员一样,Facebook将致力于维持和发展该语言的开源生态系统。

如今,Facebook上有数百名开发人员编写了数百万行Rust代码。 尽管很明显,Facebook在这种语言的未来上投入了越来越多的资金,但重要的是要了解 Facebook 如何发展到这一点。

2016–2017: Rust 最早应用于 源码版本控制系统。

Facebook的 Source Control团队启动了一个名为Mononoke的重写项目,目的是将Mercurial的提交率再提高几个数量级,以服务于Facebook的成千上万的开发人员和自动化流程。首先,用C ++开发Mononoke是显而易见的选择。 当时,Facebook的后端代码库非常C ++,这意味着Mononoke默认情况下将用C ++实现。 但是源控制团队需要考虑源控制后端的可靠性需求。 当损坏或停机可能导致服务中断时,可靠性是重中之重。 这就是为什么团队选择在C ++上 使用Rust的原因。

Facebook 在 RustConf 2019 上描述了相关体验

效果很好,Mononoke自2019年以来一直是monorepo的生产后端,多年来成功扩展了规模。

2017–2019: 各个项目陆续采用 Rust

随着Mononoke作为其可行性和实践的证明,随着时间的推移,其他项目也考虑并采用了Rust。 首先,这些通常是开发人员工具项目,不需要与更广泛的服务基础架构集成,或者是小型服务/守护程序,可以仅使用一些围绕C ++客户端库的手写包装来完成其工作。

Facebook上许多采用Rust的工程师都来自Python和Javascript背景。 他们赞赏Rust的高性能与编译时错误检测的结合。 随着公司内部流传着更多的成功案例(例如将性能提高2到4个数量级),人们越来越有兴趣将Rust用于后端服务代码,并探索其在移动应用程序中的使用。

2019–2020: 专门支持 Rust

从2017年到2019年,Source Control团队的人数增加了一倍,成为Facebook内非官方的Rust支持团队。但是到2019年,Facebook的Rust开发人员数量呈指数增长,超过了100个。

作为这种增长的一个重要例子,Rust是Diem(以前称为Libra)区块链开发中的领先语言,由独立的Diem协会监督。 Facebook通过其数字钱包Novi,成为Diem协会的会员。 Diem区块链主要是用Rust编写的,覆盖了94%的开源代码库。 此外,与Rust一起开发了Move,一种用于区块链的新型安全编程语言。

鉴于需求的增长,源代码控制团队的兼职帮助不足以支持有能力从中受益的团队数量。

我们创建了一个小的Rust开发人员经验小组,专门致力于工具和集成方面的挑战,例如建立在非Cargo生产版本中使用该语言的开源软件包注册中心生态系统的机制。 该团队为整个公司的Rust开发人员建立了一个中心联系点,优先考虑短期开发人员体验问题,改进核心库,并在新的Rust代码库通过百万行大关时为其成功奠定了基础。

未来: 2021 年及 以后

在2020年底,在fb内部编程语言组织中成立了一个Rust团队来重新履行承诺,该团队由负责Facebook的C ++标准工作和工具链的同一组织负责。

在我们的代码库中,该团队的重点是长期的工作,而不仅仅是开发人员的即时优先经验。 尤其是,为使Rust成为一种健壮,生产力的语言和社区而发展和维持的所有贡献现在都包括在内。

从短期来看,这个新团队专注于四个领域:

  • 从语言和工具链的角度为内部用户提供支持:这包括工具链的推出,跨领域迁移,代码审查/审核,最佳实践,并充当语言和工具链问题的联系点。
  • 在Facebook以外的社区中做出积极贡献:该团队对标准库和编译器进行代码审查,并为Rust社区的优先事项提供开发人员资源。
  • Rust与C++的轻松,安全的互操作性:我们有大量的C ++代码,用于与构建服务的后端系统进行通信。 我们需要开发人员能够安全,轻松地使用这些库,而又不牺牲Rust提供的好处。 相反,如果我们想将Rust组件与更大的C ++二进制文件集成在一起,则需要异步代码中的智能运行时互操作性。 Facebook的服务器分布高度且线程密集。 Rust任务需要在C ++线程池上很好地发挥作用,并安全地共享同步原语和I / O资源。 我们已经在C ++领域完成了大量工作,以改善异步性,已经支持并迅速采用了C ++ 20的协程。 将Rust引入游戏将是对它的扩展,并将基于Rust异步库堆栈中已经发生的出色工作。
  • 积极支持和与Rust基金会互动:自2016年以来,Facebook一直致力于Rust社区并通过Rust扩展其发展。我们通过以Rust白金会员身份加入Rust Foundation来进一步履行这一承诺,我们希望在此方面继续努力 以积极主动和有影响力的方式推动进步和采用。

Rust在Facebook上的旅程还远远没有结束。 这个团队很小,但是随着支持需求的扩展,它会随着时间的增长而增长。 FB 对Rust在Facebook以及整个行业中的发展轨迹感到兴奋和乐观。