深入探讨Meta如何将消息库从C重写为Rust代码

1 阅读6分钟

本文首发公众号 猩猩程序员 欢迎关注

本文来自 engineering.fb.com/2025/07/01/…

在快速发展的软件开发世界中,遗留代码是一个不可避免的现实。许多项目都是建立在数十年历史的代码基础上,尽管这些代码经过多次验证,但随着技术的发展,它们逐渐成为系统发展的瓶颈。现代化这些系统可能是一项艰巨的任务,尤其是在大规模环境下。最近在Meta技术播客的最新一集中,工程师Elaine和Bupeng分享了他们将Meta的核心消息库重写为Rust的过程。这个消息库在Messenger、Facebook、Instagram,甚至Meta的AR/VR平台上都有使用,他们的目标是将一个使用了数十年的C代码库替换为现代高效的Rust代码。

挑战:大规模遗留C代码

在深入讨论重写的细节之前,了解他们在原有C代码库上面临的挑战至关重要。这个消息库对数十亿用户的日常通信至关重要,但随着时间的推移,它成了创新和敏捷开发的瓶颈。这个库最初是用Objective-C和C语言编写的,它不仅支持像Messenger和Facebook这样的移动应用,还广泛应用于Instagram和AR/VR平台。因此,它是Meta基础设施中不可或缺的一部分,但同时也是一个难以现代化的部分。

这个遗留代码库面临的最大问题之一是内存管理。对于一个每天被数亿用户依赖的消息应用,确保内存安全至关重要。C代码时常因为内存安全问题导致崩溃,而这种问题Meta无法忽视。此外,C语言的复杂性和冗长也让代码维护变得更加困难,往往会造成“意大利面代码”——没有结构、难以阅读的代码,随着新功能的增加,问题愈加严重。

选择Rust:为什么选择一种新语言?

面对技术债务的严峻形势,Meta的工程师们需要一种能够解决现有问题,同时确保未来可扩展性的解决方案。这时,Rust这门相对较新的编程语言进入了他们的视野。尽管它有一定的学习曲线,但Rust承诺能够解决C代码无法应对的许多痛点。Rust的一个重要优势是它在编译时强制执行内存安全,这正是C代码中反复出现的问题。

Rust还提供了比C和C++更多的灵活性和现代化功能。与C++不同,C++有多种方式可以实现同样的功能,而Rust有一个统一的标准,这有助于更好的开发者协作,减少误用的机会。此外,Rust注重性能和可靠性,非常适合在移动设备和AR/VR环境中使用,这些环境对资源要求高、性能至关重要。

克服挑战:从遗留代码到现代Rust

将消息库从头开始重写并不是一项轻松的任务。Elaine和Bupeng虽然在开始时并没有Rust经验,但还是勇敢地迎接了这项具有雄心壮志的项目。他们的旅程从深入学习Rust开始,了解这门语言的独特内存管理系统及其强大的工具,比如Rust AnalyzerRust Format

团队最初面临的挑战是克服不熟悉的语法,尤其是整个基础设施建立在遗留系统上。通过与经验丰富的工程师合作,他们逐渐掌握了Rust的复杂性。导师制度和协作学习对他们迅速适应这门语言起到了关键作用。尽管他们是Rust的新手,但通过代码评审,他们得到了有价值的反馈,这帮助他们不断完善自己的技能并理解语言的细微差别。

其中最具挑战性的部分是Rust的内存管理模型。Rust的所有权系统,确保内存安全,最初让他们感到难以理解。然而,一旦Elaine和Bupeng掌握了所有权和借用的概念,他们发现它大大减少了内存安全问题,相比于C语言的经验,这是一项巨大的进步。

实用的进展:渐进式进展

尽管团队仍处于重写的早期阶段,但他们的进展是有条不紊的。目标不是一夜之间完成重写,而是逐步地用Rust替换C代码库的各个部分。这种方法确保团队可以在处理其他高优先级项目时不会被全面重写的复杂性所拖累。同时,它也允许持续改进,每一步的进展都有助于系统变得更易维护、更稳定。

成功的一个关键衡量标准是节省的工程时间以及减少内存相关问题。虽然迁移仍处于早期阶段,但团队的反馈是积极的。能够编写干净、安全的代码使得开发过程更加愉快,也减少了出错的几率。团队还注意到,特别是在移动应用集成和跨平台的实时消息体验方面,性能有了显著改善。

展望未来:Rust在Meta代码库中的未来

尽管已经取得了一些进展,但仍然存在需要解决的挑战。例如,将Rust与现有C基础设施集成时,出现了导出和链接错误的问题。此外,团队仍在实验Rust的异步功能以及如何将其最佳集成到现有系统中。然而,总的来说,转向Rust代表着Meta对可扩展性和可维护性的大规模投资。

随着Meta继续推进Rust的应用,Elaine和Bupeng的经验为其他面临类似遗留代码问题的公司提供了宝贵的借鉴。重要的经验教训是,现代化遗留系统不仅仅是重写代码。这是一个关于认真考虑开发者需求、所需工具,以及对系统可扩展性和可维护性长期影响的过程。Rust凭借其内存安全性和开发者生产力的优先考虑,为希望现代化遗留代码库的公司提供了有力的解决方案。

结语

从遗留系统迁移到现代语言永远不会是简单的。然而,正如Meta的工程师们所展示的那样,通过将这一过程分解为可管理的小步骤,并专注于长期目标,完成这一迁移是完全可行的。从C到Rust的迁移仍在进行中,但初步迹象表明,这将会带来一个更高效、可维护且可靠的消息基础设施 — 一个可以为Meta的平台提供多年支持的系统。随着Elaine和Bupeng的继续努力,他们可能会遇到新的挑战,但他们可以放心的是,他们的工作正在改变数十亿人之间的沟通方式。

本文首发公众号 猩猩程序员 欢迎关注