作者 | Mike Shaver
翻譯 | 劉雅夢
策劃 | Tina
Shopify 為商業構建互聯網基礎設施,以滿足數百萬商家的需求。為了做到這一點,需要構建靈活的業務邏輯和健壯的高性能系統。除了我們對 Ruby 的靈活性和表現力的承諾之外,我們最近還采用了 Rust 作為我們官方的系統編程語言。作為這項工作的一部分,我們加入了 Rust 基金會,并且我們很高興能加入 Rust 社區。
系統編程是軟件工程中的一個要求很高的領域,為其選擇的語言將會對系統軟件的成功和有效性產生巨大的影響。用于解決這些問題的語言需要快速、高效且安全。此外,如果可能,Shopify 更喜歡社區驅動的開源項目。
Rust 不斷增長的行業勢頭和 Shopify 不斷擴大的系統編程項目基礎,使我們在 Rust 上進行標準化并加入 Rust 基金會正當其時。
Shopify 的系統編程
自成立以來,Shopify 的主要服務端應用程序編程語言一直是 Ruby。Ruby 的靈活性和表現力使 Shopify 能夠開發出強大的商務系統,滿足數百萬商家以及數億買家的需求。Ruby 過去是,現在是,將來依然是我們構建現代商務服務端組件時的首選工具。
對于系統編程,例如高性能網絡服務器或使用“原生”代碼擴展 Ruby,而不是定義業務邏輯,Shopify 開發人員過去一直使用 C 和 Go 等語言。最近,我們決定將 Rust 標準化為我們的系統編程語言。因此,我們正致力于在開發和部署流程中更好地支持 Rust,并幫助 Shopify 工程師開發 Rust 編程方面的專業知識。
為什么選擇 Rust?
Rust 的許多方面使它成為我們系統編程語言的一個有吸引力的選擇。這些因素結合起來使我們相信 Rust 將會成為我們軟件堆棧中一個強大且受歡迎的組件。其他公司可能會對語言的不同屬性進行不同的權衡,做出不同的選擇;我們的評估最終使我們選擇了 Rust。
一致性
Shopify 的系統編程需要涵蓋多個領域,而且隨著時間的推移,這個數字可能會增加。它們包括高性能服務器、用于提高性能或橋接到其他庫的 Ruby 擴展,以及編譯為 WebAssembly。我們非常希望將對單一語言的投資運用到眾多領域,這意味著要確定一種可以非常靈活使用的語言。相關類型的系統編程將對組織的語言選擇產生重大影響;我們需要對此有更寬泛的視角。
性能
Shopify 需要能夠高效且可持續地擴縮,以支持全球商業。Rust 為我們提供了可預測的原生代碼性能,包括對內存使用的精細控制,這使其適用于我們堆棧的最低級別。當然,Rust 并不是唯一能夠提供或接近這種性能的語言。在此基礎上,還可以考慮使用現代 C++,或者如果可以接受垃圾收集器的分配行為和性能的話,則可以考慮 Go。
當然,雖然 Rust 具有很高的性能上限,但它本質上并沒有提高性能下限。一個應用程序或組件并不會因為它是用 Rust 編寫的就神奇地快;程序員仍然需要設計和衡量性能,我們需要確保 Shopify 的 Rust 開發人員擁有必要的工具來輕松完成這項工作。隨著我們與 Rust 及其社區的合作,這種支持將成為 Shopify 感興趣的一個重要領域。
社區
Rust 語言和生態系統是由一個健康的社區驅動的,我們打算像參與 Ruby、 Rails、 React Native 和其他開源項目一樣參與這個社區。Rust 的 RFC 流程和治理架構為包容且深思熟慮的討論提供了堅實的基礎,從而推動了語言和工具的未來發展。希望我們的貢獻不僅能使 Rust 在 Shopify 的使用中變得更加高效,而且還能為所有 Rust 開發人員帶來改進。
這就是 Shopify 加入 Rust 基金會的原因。我們希望支持 Rust 優秀的治理模式和“Rust 公地”的維護,并將我們的知識和觀點帶入到更大的 Rust 對話中。Rust 基金會為確保 Rust 社區和生態系統的健康所做的工作至關重要,我們非常自豪能夠參與他們的使命。
生產力
在某些圈子里,Rust 以難以學習和使用而聞名,但 Shopify 內部和外部的開發人員發現,在通過了最初的學習階段之后,他們可以非常高效且輕松地使用 Rust 進行構建。Rust 還有一個強大的庫生態系統(“板條箱”)和良好的 IDE 集成工具,當然還有非常好的編譯器錯誤消息。類型和宏系統的強大功能允許非常有表現力的 API 和語法,將開發人員的精力集中在表達他們的思想上,而不是在頭腦中擺弄大量的狀態和不變量。Go 在這方面也享有盛譽,C 和 C++ 就沒那么好了。
安全性
Rust 提供了許多讓編譯器來幫助確保程序正確的工具,包括它們可以安全地管理內存,并且可以“無所畏懼地并行”。隨著我們越來越熟練地使用 Rust,我們將會找到更多的方法來使用 Rust 的類型系統和安全規則來保持系統中的不變量。從我們最初的項目中,我們發現與我們評估的其他語言相比,Rust 會在編譯時而不是運行時暴露出更多的錯誤。這促成了 Rust 開發人員經常表達的“有信心部署”情緒。
在我們所考慮的所有語言中,Rust 在安全因素方面遙遙領先:不僅是在生命周期管理方面的內存安全上,它還消除了并行程序中的大多數數據競爭。當然,即使是 Rust,它也有改進的空間,例如靜態死鎖預防,但所有生產語言都是如此。我們相信 Rust 對靜態安全性的承諾會使其最有可能在未來幾年中實現這一目標。在這個領域已經有了一些有趣的工作,例如 Ferrocene。
互操作性
系統編程通常涉及到與現有的“原生”庫(比如用 C 編寫的庫)的接口。與 Go 不同的是,Rust 沒有垃圾收集器,這使得它可以更容易地插入到可以使用 C 的任何地方。更具體地說,Rust 很好地支持了使用 bindgen 等工具與現有的 C 代碼的集成,而像 rb-sys 和 magnus 這樣的板條箱允許 Rust 安全地與 Ruby 互操作。C++ 的集成仍然有些笨拙,但像 cxx 這樣的板條箱可以幫助彌合語言障礙。除了 RubyVM 本身之外,我們沒有大型的 C 或 C++ 代碼庫,但這種互操作對我們來說仍然是一個重要的考慮因素。
接下來做什么?
在 Shopify,我們的 Rust 之旅才剛剛開始。我們需要開發教育資源和內部工具,并學習如何最好地參與 Rust 社區和生態系統。我們很高興能成為 Rust 使命的一部分,讓每個人都能構建可持續的、內存安全的、高效的軟件,并感謝 Rust 基金會的歡迎加入。
Mike Shaver 是 Shopify 核心工程的杰出工程師。
如果你對從頭開始構建系統來解決現實世界中的問題感興趣,我們的工程博客中有關于我們遇到的其他挑戰故事。訪問我們的工程職業位頁面,了解我們的空缺職位。加入我們的遠程團隊,可以(幾乎)在任何地方工作。了解我們是如何通過招聘來共同設計未來的——一個通過設計實現數字化的未來。
原文鏈接:
https://shopify.engineering/shopify-rust-systems-programming