NPM 採用 Rust 以消除效能瓶頸
Npam 的指數級增長促使 npm 工程團隊從 Node.js 切換到 Rust,以處理那些將成為效能瓶頸的 CPU 繫結任務。最近的一份白皮書 概述了在 Rust 中開發這個新服務,以及將其投入生產一年多的經驗。
大部分 npm 操作是流量密集型的,Node.js 正是針對這種場景設計的。但是,npm 工程師們發現,確保只有授權使用者可以釋出包的授權服務顯示出令人擔心的計算密集型負載。Npm 工程師 Chris Dickinson 解釋到,因為身份驗證服務有點過時了,所以做出從頭開始重寫它的決定並不難。因此,npm 工程師開始尋找最適合該任務的程式語言。因為缺乏記憶體安全性,C 和 C++ 很快就被排除在外,而 Java 因為依賴虛擬機器,也出局了。剩下的語言有兩種,分別是 Go 和 Rust。為了更好地評估最終解決方案,npm 團隊決定用這兩種語言以及 Node.js 分別重寫他們的身份驗證服務,以便進行比較。
不可否認,npm 的身份驗證服務沒那麼複雜,以 Node.js 重寫只花了一個小時。另一方面,Go 需要 2 天,但以 Rust 重寫花了整整一個星期,主要是因為 Rust 的學習曲線更加陡峭以及該語言的內在複雜性,Chris Dickinson 這樣解釋說。
我們將編寫一個正確的程式,但是,我們必須思考該正確程式的方方面面。
最後,npm 團隊決定部署 Rust 版本的身份驗證服務,這主要歸功於他們獲得來自 Rust 社群的強力支援,以及與當時 Go 能提供的包管理器相比,Rust 包管理器 Cargo 具有優勢。
對 npm 團隊來說,好訊息是 Rust 服務已經在生產環境中執行一年有餘,沒有任何告警。這與在 npm 部署 Node.js 服務的常規經驗形成鮮明對比,為讓錯誤和資源的使用可控,在 npm 部署 Node.js 要包括大量的監控。消極的一面是,根據 Chris Dickinson 的說法,在 npm 引入 Rust 的最大缺點就是不得不處理另外的棧,包括監控和日誌記錄。