Facebook 是如何引入並使用 Rust 的?
作者 | Facebook 工程
譯者 | Sambodhi
策劃 | 凌敏
Facebook 正在擁抱當今最受歡迎、發展最快的一門編程語言——Rust。當前,Facebook 除了爲公司內部的 Rust 團隊引進人才,還正式加入了 Rust 基金會,與 Mozilla(Rust 的創造者)、AWS、微軟和谷歌等其他成員一起,致力於維持和發展 Rust 的開源生態系統。
Rust 爲開發者提供了類似 C++ 之類的老編程語言的性能,並更注重代碼的安全性。如今,在 Facebook 有數百名開發者在編寫數百萬行 Rust 代碼。很明顯, Facebook 未來在這門語言上的投入會越來越大。在分享未來的具體投入舉措之前,有必要先了解下 Facebook 早期是如何引入並使用 Rust 的。
2016~2017 年:早期用於源代碼控制
我們最古老的 Rust 代碼庫可以追溯到 2016 年。當時,Facebook 單體倉庫中的源代碼變化率開始 “侵佔” Mercurial 源代碼控制管理工具所能跟上的最大提交率。對此,Facebook 的源代碼控制團隊發起了一項名爲 Mononoke 的重寫項目,旨在將 Mercurial 的提交率再提高一些數量級,從而滿足 Facebook 成千上萬的開發者和自動化流程。
起初,使用 C++ 開發 Mononoke 顯然是個選擇。在那時,Facebook 的後端代碼庫對 C++ 非常重視,這意味着 Mononoke 默認會使用 C++ 實現。但是,源代碼控制團隊需要考慮源代碼控制管理後端的可靠性需求,如果服務因停機或損壞而造成停頓時,那麼可靠性就成了首要的考慮因素。因此,團隊選擇使用 Rust 代替了 C++。
Mononoke 是一款優秀的測試平臺,因爲它和其他 Facebook 系統有着天然的隔閡。如果 Mononoke 能夠使用 Mercurial 協議與客戶端服務進行對話,並使用 Thrift 協議與某些存儲系統進行通信,那麼選擇 Rust 不會影響源代碼控制團隊工作之外的任何事情。
源代碼控制團隊願意採用並且能夠支持他們自己使用任何 Rust 特定的工具和基礎設施。從 2019 年開始,Mononoke 就已經成爲我們單體倉庫的生產後端,並在過去幾年裏成功地擴大了規模。
2017~2019 年:採用曲線
Mononoke 足以證明採用 Rust 是可行的,隨着時間的推移,其他項目也開始考慮和採用 Rust。一開始,這些項目通常是開發者的工具項目,它們不需要與更廣泛的服務基礎設施進行集成,也不需要小型服務 / 守護進程,只需圍繞一些 C++ 客戶端庫使用幾個手寫的包裝器就能完成工作。
在 Facebook 的 Rust 工程師中,有許多人具有 Python 和 JavaScript 的背景,他們很欣賞 Rust 結合了高性能與編譯時錯誤檢測這一特性。隨着越來越多的成功案例(例如性能提升了 2 到 4 個數量級等)在公司內部流傳,人們對使用 Rust 實現後端服務代碼,以及探索其在移動應用程序中的應用的興趣越來越濃。
2019~2020 年:Rust 得到了一些專門支持
2017 年到 2019 年,源代碼控制團隊成爲 Facebook 內的非官方 Rust 支持團隊。到了 2019 年,Facebook 的 Rust 開發者數量成倍增長,達到 100 多人。
增長背後的原因之一是,Rust 是開發 Diem(原 Libra)區塊鏈的主要語言,由獨立的 Diem 協會監督,而 Facebook 的數字錢包 Novi 就是 Diem 協會的成員。Diem 區塊鏈主要是由 Rust 編寫的,並涵蓋了 94% 的開源代碼庫。
考慮到需求的增加,源代碼控制團隊的兼職協助並不足以支持受益的團隊數量。因此,我們創建了一個小型的 Rust 開發者體驗團隊,該團隊致力於解決工具和集成方面的挑戰,比如在生產非 cargo 構建中使用語言的開源包註冊表生態系統的機制。該團隊爲整個公司的 Rust 開發者建立了一箇中央連接點以解鎖用例,優先考慮短期的開發者體驗問題,改進核心庫,並在剛剛起步的 Rust 代碼庫通過百萬行大關時爲其成功奠定基礎。
未來(2021 年及以後)
2020 年底,我們在編程語言組織中成立了一個 Rust 團隊,以重申我們的承諾,該團隊還負責 Facebook 的 C++ 標準工作和工具鏈。
從近期來看,這個新團隊主要關注四個方面:
-
從語言和工具鏈的角度支持內部用戶**:**這包括工具鏈的推出、橫切遷移、代碼審查 / 審計、最佳實踐,以及作爲語言和工具鏈問題的連接點。
-
在 Facebook 以外的社區作出積極的貢獻**:**該團隊對標準庫和編譯器進行代碼審查,併爲 Rust 社區的優先事項提供開發者資源。
-
Rust 與 C++ 的輕鬆、安全的互操作性**:**我們擁有大量的 C++ 代碼,用於與服務所建立的後端系統的通信。在不犧牲 Rust 的優點的情況下,我們需要開發者能夠安全、輕鬆地使用這些庫。相反,如果我們希望看到 Rust 組件與更大的 C++ 二進制文件集成,我們就需要智能運行時的異步代碼互操作性。Facebook 的服務器是高度分佈式的,並且有大量線程。Rust 任務需要在 C++ 的線程池中良好運行,並且能夠安全地共享同步原語和 I/O 資源。爲了提高異步性,支持並迅速採用了 C++20 的協程,我們在 C++ 方面做了很多工作。把 Rust 帶到遊戲中就是它的擴展,它將建立在 Rust 在異步庫棧中已經完成的出色工作的基礎上。
-
積極支持並參與 Rust 基金會的工作**:**自 2016 年以來,Facebook 一直致力於 Rust 社區並擴大其與 Rust 的發展。通過加入 Rust 基金會,我們成爲白金會員,進一步履行這一承諾,並希望以一種積極和有影響力的方式幫助 Rust 繼續取得進展並得到應用。
Facebook 的 Rust 之旅遠沒有結束。這支團隊雖小,但隨着支持需求的增加,會不斷壯大。Rust 在 Facebook 和整個行業的發展軌跡讓我們感到興奮和樂觀,Facebook 內部的工作日程安排、開源貢獻和更多面向社區的工作都將在 2021 年展開。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/5_KBhEAu29TbWLcaKI_xcw