Facebook是如何引入並使用Rust的?

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