在Python和Go專案之後使用Rust的經驗分享 - scaleway

banq發表於2021-11-25

我於 2021 年 1 月加入 Scaleway,建立新的網路系統和自動化團隊,負責所有工具和基礎設施,以幫助網路工程師團隊。在這一點上,我主要使用 Python 和 Go 進行編碼,我正在尋找一個有用的、非關鍵的專案來開始試驗 Rust 並評估它是否對我們的內部堆疊開發感興趣。
Scaleway 在我們的日常工作中使用了許多不同的內部系統,並維護所有系統的正常工作。
我們長期使用的其中之一是著名的Netbox,作為我們的 DCIM/IPAM,用於管理我們所有的硬體庫存和 IP 定址計劃。我們最近部署了另一個鮮為人知的開源產品Netshot,以滿足我們的網路配置合規性和備份需求,同時也替換了我們舊的 RANCID,它只做配置備份並且更難維護。
由於 Netbox 是我們庫存的真實來源,而且我們有大量的網路裝置(交換機、路由器等)需要管理,因此在 Netshot 上手動新增所有現有和新裝置是不可能的每次我們在 Netbox 中新增一些東西時。
我們搜尋了可以將裝置從 Netbox 同步到 Netshot 的現有工具,但找不到任何東西。
我在 Python 和 Go 方面有很多經驗,但我想在一個新的非關鍵專案中試驗 Rust,對於這個專案是一個很好的候選。
 

Rust vs. Python vs. Go
我希望與 Rust 合作,因為它似乎是一種專注於安全性和良好效能的語言。
我喜歡使用靜態型別安全,IDE 可以用幾種語言幫助解決這個問題。但是由於 Python 的 IDE 在型別安全、重構和完成功能方面並不總是最佳的(它提供了一種帶有型別提示的靜態型別 - 但它沒有被強制執行,並不總是可用,因為 Python 是動態的,並不總是可預測的,它不提供最終任何真正的安全)。所以,我選擇了 Rust。
我還在尋找一種可以在單個無執行時二進位制檔案中編譯或打包的語言,這樣我們就不必管理任何 Python 或庫版本要求。
我喜歡泛型、可選型別、模式匹配和適當的錯誤管理等高階功能,所以 Rust 似乎比 Go 更合適。

  • 如果該專案在 Python 上執行:必須在我們想要部署它的任何地方管理依賴項的麻煩,或者必須為它建立大量的容器映像 - 部署速度較慢且難以維護。
  • 如果該專案在 Go 上執行,但錯誤管理不會那麼有效:Go 中缺少泛型有時也會讓你做一些骯髒的變通方法,而 Rust 會給你一些有趣的功能方法(模式匹配、強大的集合)庫包)。

總結:這個專案在 Python 或 Go 中的工作方式相同,但在 Rust 中編碼更有效!
 

體驗報告
對於使用新語言的第一個專案來說,這種體驗很好。編譯失敗時的錯誤資訊非常明確,通常直接包含問題的解決方案。這些庫通常有很好的文件,比如reqwestserdestructopt在我的例子中,這使得它們易於使用,並且與您從 Python 等動態語言中可以獲得的相比,各種 IDE 幫助的自動完成功能(型別提示不是精確到真正的靜態型別)
當您來自其他語言時,將測試作為子模組直接包含在每個 Rust 檔案中的事實有點令人驚訝。但它易於管理,並且來自cargo的整合測試系統是使用者友好的。
我在記憶體管理方面遇到了一些麻煩,因為當您習慣於使用垃圾收集器(如 Python 或 Go)使用語言進行編碼時,您已經習慣了編譯器給出一些提示但並不總是指向問題的根源。因為這對我來說不是一個持續存在的問題,所以我不時使用 .clone() 以避免過多地增加複雜性。
我還喜歡這樣一個事實,即有 Cargo 外掛可以直接建立 deb 和 rpm 檔案,以便在各種 Linux 發行版上輕鬆分發應用程式。
這是一次很好的體驗,我喜歡使用 Rust,我將在下一個專案中再次使用它。可能有些程式碼直接在 Cisco Nexus 裝置上執行,以避免使用舊的 Python 2。Rust 將成為團隊中的預設語言之一,因為我們一直對其功能感到滿意。
由於不必手動新增所有新裝置,開發此工具為我們節省了大量時間和麻煩。該專案可在此處獲得,旁邊還有 Scaleway 參與的其他開源專案。

相關文章