天天看點

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結

作者 | 雷卷

來源 | 淩雲時刻(微信号:linuxpk)

前言

Rust 在 Stack Overflow 上連續5年被評為最想學習的程式設計語言,一直備受好評,是以這篇文章完全就是标題黨,當然必須投資,明眼人都知道,也不需要我來為Rust搖旗呐喊。

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結

下面内容是我個人一些學習點滴,同時結合我平時工作的一些情況,探讨一下 Rust 的可行性,算是落地場景讨論吧。

當然你可以了解為一個Up主做直播,沒有什麼話題,就是和大家随便聊聊技術,不過我這個是文字版的。

Rust 和雲

微軟的這篇文章 Microsoft: Rust Is the Industry's 'Best Chance' at Safe Systems Programming 闡述的非常清楚,雲是工業級的産品,當然需要工業級的安全系統。這裡的安全不是指網際網路安全等,而是軟體開發中的 Memory Safe、Type Safe 和 Thread Safe等,這樣才能保證産品的運作其的穩定性。

我們知道新産品釋出後,接下來一段時間基本就是各種 bug 修複,這些 bug 通常不是業務上的 bug,而是代碼級别的 bug,比如記憶體溢出啊、空指針、并發控制沒有做好導緻資料錯誤等等。這些 bug 都很難被測試出來,如果有一個好的開發語言能幫助消除這方面潛在的很多問題,是不是非常好?

性能,這個大家不用擔心,Rust is as fast as C and C++。

我非常認同文章中的觀點,Rust 是非常好的基礎設施類雲産品開發語言,這是穩定性的保障,也是對客戶負責。大家都說用網際網路的思維做雲産品,但是雲廠商的重要客戶都是企業客戶,穩定性保障是第一位的,可能讓企業來用自己的業務來為雲産品試錯。

另外一個消息:Programming languages: Now Rust project looks for a way into the Linux kernel, 也就是 Linux 核心可能擁抱 Rust 語言,當然 Linus Torvalds 是已經認可啦。

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結

産品 Rust SDK 開發

使用 Rust 開發基礎設施雲産品的優點就不贅述啦!性能好、穩定性高。

如果我們做不到産品用 Rust 開發,那麼是不是普通程式員就不能接觸 Rust 啦?完全不是,這裡有一個産品

Rust SDK 開發。很多雲廠商的中間件産品都是 Java 語言、Cpp 語言開發的,我們都需要開發不用開發語言的 SDK,如 Java SDK、Python SDK 等。

那麼産品的 Rust SDK 有什麼不同之處嗎?這裡我給你解釋一下。這裡我們就舉 Alibaba Dubbo 的例子吧,如果你不知道 Dubbo,現在隻要了解為分布式 RPC 調用架構就可以。Dubbo Rust SDK 有以下一些特點:

  • 為Rust應用提供通路 Dubbo 的服務支援

如果客戶的系統本來就是采用 Rust 開發,那麼通過Rust通路 Dubbo 服務,這個需求應該沒有什麼好反駁的吧?要知道 Rust Web 架構 Actix-web 在性能測試中是排名靠前的。當然對 Dubbo Rust SDK,尤其針對IO和網絡這一塊,基本上都是通過 Tokio 實作的,是以預設就是支援異步化的,性能當然也是非常高的。

稍等一下,寫一個涉及網絡調用的 SDK 哪那麼簡單啊?

你就說一下使用 Tokio,還是有非常多的工作量的,不是那麼好寫的。 理論上是這樣的,但是如果你看一下 Tokio 0.2.22版本的 tutorial ,你會發現就非常簡單啦!這個 tutorial 不是告訴你如何寫一個 Echo Server & Client,而是告訴你如何實作一個 Mini Redis,文檔和代碼樣例都非常全,你隻要一些調整,估計就能初步實作産品 Rust SDK 的功能。

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結
  • 為 Rust WebAssembly 提供通路 Dubbo 支援

我們知道 WebAssembly 目前首選語言是Rust,假設你想在 WebAssembly 中通路 Dubbo 服務,如在浏覽器中,我們隻需要做 WebSocket 适配,在 WebAssembly 獨立運作環境,我們可以通過 WASI Socket 來通路 Dubbo 服務。而針對 Wasm 的 Rust SDK 基本就是共享 Rust SDK 代碼,然後做一些修改。

當然 WebAssembly 還承擔着通用開發包(Universal Library)的角色,如果大家看過 wasmtime demo 的例子就應該能了解。

  • 為 Deno JavaScript / TypeScript 提供通路 Dubbo 支援

這裡我們不想讨論 Node.js 和 Deno 誰是最後大赢家的問題,假設一些 JavaScript / TypeScript 的開發工程師選擇了 Deno,我們知道 Deno 是基于 Rust 建構的,通過 Deno Plugin 為 JS / TS 提供調用接口,然後通過對應産品的 Rust SDK 實作,這樣你不需要做太多的工作,使用 Deno 平台的同學就可以通過 JS / TS 通路你釋出的服務啦。

Node.js 的開發者衆多,但是我們都知道使用C++開發一個 Node.js 擴充不是那麼容易的,隻有極少數的同學有這個能力。那麼開發一個 Deno Rust Plugin 複雜嗎?可以說是非常簡單,你隻需要參考一下 Calcite 架構, 有非常好的文檔和樣例,同時結合一下

https://crates.io/

上的開發包,開發一個高品質的 Deno Rust plugin 非常簡單。

  • 為 C 語言提供通路 Dubbo 服務支援

如何為 C 語言提供 Dubbo 的通路支援?如果你問這個問題,估計會被打死的,但是沒有關系,假設一些 ARM 裝置的 C 程式想通路 Dubbo 服務,我們完全可以通過 Rust FFI 導出 cdylib 庫,提供給C語言調用,這樣省去我們開發 C SDK 的成本,而且這個成本并不低。我之前還想給 RSocket 寫一個 C 的 SDK,仔細想了一下還是放棄啦,現在打算通過 Rust SDK 來為 C 提供通路接口。如果 C 能通路,那麼基于 C 之上的一些小衆語言,如 Lua 等,是不是也是可以通路 Dubbo 服務的。

  • 為其他語言提供運作期支援

上面我們談到了 Rust SDK 通過 FFI 為 C 語言提供對應的 SDK,同樣原理還可以套用到其他語言上,典型的就是 Calling Rust From Python,這個網上一堆案例,同樣的還試用于 Ruby 語言。Java 有沒有對應的案例呢?有的,就是 java-ext-wasm 這個項目,也就是在 JVM 中内嵌 WebAssembly 運作期環境,來運作 WebAssembly,而這個 WebAssembly Runtime 就是 Rust 編寫的。

Rust 的開發者體驗

Rust 的開發體驗非常好,我們都知道 JavaScript 的開發者體驗基本是 No.1 的,是以我們就不拿 Rust 和 Golang、Java 來對比,我們直接看一下 Rust 和 JavaScript 的開發體驗對比,如下:

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結

個人覺得 Rust 一些方面比 JavaScript 還好,如内置單元測試支援、example 樣例支援、 文檔 doc、代碼格式化 format、Clippy(Linter) 等支援,這個是比 JS 要好一些的。

如果你拿 C++ 和 Rust 做開發者體驗對比,那簡直是地下和天上,諸如 Linux、Windows 和 Mac 平台的一緻性等,這些都是 C++ 無法 Rust 對比的,更不用說 Rust 還有

,這個也是 C++ 沒有的。

目前來說,Rust 一個不好的開發者體驗就是編譯速度太慢,沒有辦法,編譯器做了非常多的工作,但是好像有一個 sccache - Shared Compilation Cache 能提升編譯速度,這個我還沒有使用過,可能是我的項目都不夠大,我還沒有遇到編譯速度非常慢的情況,基本還能接受。 當然 Rust 社群也在讨論 pre-built 依賴問題,可能需要一些時間。

Rust 沒有想象的那麼複雜 學習成本沒有那麼高

講到這裡,一定有同學想嘗試學習和了解Rust,那麼學習成本高不高?個人覺得要從幾個方面來看。

  • 學習資料

在所有的開發語言中,Rust 的文檔是最好的,沒有之一。

https://www.rust-lang.org/learn

上的《The Rust Programming Language》 可以說是最好的學習圖書,完全免費,且更新比較快。個人覺得品質堪比 Pragmatic Bookshelf 的《Programming Ruby》,但是 Rust 是免費的,而且經常更新的。當然其他 Rust 相關的文檔,如 Rust By Example,Rust WebAssembly 等,文檔品質都非常高。

另外大家都喜歡的 Cheat Sheet,你看一下 Rust 的 Cheat Sheet,就明白啦。

https://cheats.rs/

當然其他語言也有對應的文檔,但是我想問一下有幾個 Java 開發者是去 Oracle Java 站點學習 Java 的?但是 Rust 做的就不一樣,所有的學習文檔都堪稱一流,讓你學習無壓力。

  • Rust Module 了解起來不容易

确實剛開始一頭霧水,我覺得這篇文章 Clear explanation of Rust’s module system 非常好,廢話多說無益,看完後基本全明白啦!

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結
  • Rust Ownership

剛接觸的同學非常頭痛,至少我是,但是這也是 Rust 的特點,沒有 GC,但是能做到 GC 差不多的效果,當然要走不同尋常路。但是也沒有那麼頭痛,找幾篇 Rust Ownership 的文章看一下,就可以啦。另外我推薦一下這個站點,這個老頭的 Rust 教學視訊非常好,非常容易了解, 資料也比較多,相信你看啦就明白啦,你隻需要一個好的指導。

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結
  • Rust Enum

Rust 的 Enum 功能非常強大,這個要特别留意一下,個人覺得 Swift 的 Enum 能和 Rust Enum 有一拼。我們經常看到其他語言中的 Result、Optional 等,在 Rust 中都是通過 Enum 實作的。

  • Tokio

Rust 其他的特性我就不說啦,其他語言都有。這裡說明一下 Tokio。

Tokio 是 Rust 下的異步化架構,其地位相當于 Netty 在 Java 的作用,知名的 Deno 架構就是基于 V8 + Rust + Tokio 建構的。如果你有 JavaScript 的經驗同時了解 Promise,那麼 Tokio 的 Future async / await 和 JavaScript 的 Promise async / await 差不多,Tokio 的 Asynchronous stream 和 JavaScript 的 AsyncIterableIterator 也類似,學習的成本并不高。如果是 Java 程式員,可能了解起來有些吃力,但是如果你了解 Java 下的 Reactive 架構,如 RxJava 和 Reactor,那麼了解起來也比較容易。

總結

當然這些是個人學習、編寫一些 Rust Demo 和 Deno 了解等得出的結論,沒有什麼大道理,就是落實在一些點上,當然也就不可能非常全面,也就提供給你參考一下。

最後,學習一門語言,千萬不要聽什麼語言大師的,就是自己看資料、寫 Demo、同時多看一些知名開源軟體的代碼,然後自己得出結論,哪怕是那種從入門到放棄的那種。

另外大家都可以參考一下 Considering Rust,幫助你更好地了解 Rust。

掃描下方二維碼關注“淩雲時刻”公衆号回複“Rust”擷取Considering Rust演講文稿PDF

該不該在 Rust 上做點投資?前言Rust 和雲産品 Rust SDK 開發Rust 的開發者體驗Rust 沒有想象的那麼複雜 學習成本沒有那麼高總結