國內首個基於 Rust 語言的 RPC 框架 — Volo 正式開源!
Volo 是字節跳動服務框架團隊研發的 輕量級、高性能、可擴展性強、易用性好 的 Rust RPC 框架,使用了 Rust 最新的 GAT 和 TAIT 特性。
在字節內部,Volo 已經落地多個業務和基礎組件,並且取得了超預期的性能收益(與 Go 版本對比,不那麼公平)。
Volo 與其它 CloudWeGo 開源項目一樣,堅持內外維護一套代碼,爲開源使用提供了強有力的保障。同時,我們觀察到 Rust 開源社區在 RPC 框架這塊還比較薄弱,Volo 的開源希望能爲社區的完善貢獻一份力量,同時也能完善 CloudWeGo 生態矩陣,爲追求性能、安全性和最新技術的開發者、企業以及 Rustaceans 開發 RPC 微服務、搭建雲原生分佈式系統提供強有力的支持。
本文會爲大家簡單介紹 Volo 及其相關生態,併爲大家提供一個簡單的 Rust 與 Go 的選型建議。
01 項目緣起
其實 Volo 的創始成員來自於 Kitex 團隊(CloudWeGo 開源的 Go RPC 框架),當時我們在 Go 上做了非常深度的性能優化,也因此深刻感受到了在 Go 上做性能優化所面臨的阻礙。因此,我們選擇了 Rust,期望能夠給需求極致性能、安全和指令級掌控能力的業務一個合適的選擇。而 RPC 框架是分佈式系統中重要的組成部分,Volo 就這麼誕生了。
02 特性
高性能
Rust 以高性能和安全著稱,我們在設計和實現過程中也時刻以高性能作爲我們的目標,儘可能降低每一處的開銷,提升每一處實現的性能。
首先要說明,和 Go 的框架對比性能是極不公平的因此我們不會着重比較 Volo 和 Kitex 的性能,並且我們給出的數據僅能作爲參考,希望大家能夠客觀看待。同時,由於在開源社區並沒有找到另一款成熟的 Rust 語言的 Async 版本 Thrift RPC 框架,而且性能對比總是容易引戰,因此我們希望儘可能弱化性能數據的對比,僅會公佈我們自己極限 QPS 的數據。
在和 Kitex 相同的測試條件(限制 4C)下,Volo 極限 QPS 爲 35W。同時,我們內部正在驗證基於 Monoio(CloudWeGo 開源的 Rust Async Runtime)的版本,極限 QPS 可以達到 44W。
從我們線上業務的火焰圖來看,得益於 Rust 的靜態分發和優秀的編譯優化,框架部分的開銷基本可以忽略不計(不包含 syscall 開銷)。
基於 GAT 設計
我們熱愛並追隨最新的技術,Volo 的核心抽象使用了 Rust 最新的 GAT 特性,在這個過程中我們也借鑑了 Tower 的設計。Tower 是一個非常優秀的抽象層設計,適用於非 GAT 的情況下。在此我們非常感謝 Tower 團隊。
Tower: https://github.com/tower-rs/tower
通過 GAT,我們可以避免很多不必要的 Box 內存分配,以及提升易用性,給用戶提供更友好的編程接口和更符合人體工程學的編程範式。
我們的核心抽象如下:
由於使用了 Rust 的 GAT 特性,因此我們可以解決返回異步 Future 帶來的生命週期問題。同時,如果配合 type_alias_impl_trait 使用,效果更佳,比如實現 Timeout 可以使用如下方式:
易用性好
Rust 以難學難用而聞名,我們希望儘可能降低用戶使用 Volo 框架以及使用 Rust 語言編寫微服務的難度,提供最符合人體工程學和直覺的編碼體驗。因此,我們把易用性作爲我們重要的目標之一。
比如,我們提供了 Volo 命令行工具,用於初始化項目以及管理 IDL。同時,我們將 Thrift 及 gRPC 拆分爲兩個獨立(但共用一些組件)的框架,以提供最符合不同協議語義的編程範式及接口。
我們還提供了 #[service] 宏(可以理解爲不需要 Box 的 async_trait 來使得用戶可以無心理負擔地使用異步來編寫 Service 中間件。
通過這個宏,我們編寫 Service 中間件可以簡化到如下圖:
擴展性強
受益於 Rust 強大的表達和抽象能力,通過靈活的中間件 Service 抽象,開發者可以以非常統一的形式,對 RPC 元信息、請求和響應做處理。
比如,服務發現、負載均衡等服務治理功能,都可以以 Service 形式進行實現,而不需要獨立實現 Trait。
相關的擴展,我們會放在 github.com/volo-rs 組織下,也歡迎大家貢獻自己的擴展到 volo-rs。
03 生態系統
Volo 是 RPC 框架的名字,隨着 Volo 一起開源的有以下幾個項目:
*1. Volo-rs:Volo 的相關生態。
*2. Pilota:Volo 使用的 Thrift 與 Protobuf 編譯器及編解碼的純 Rust 實現(不依賴 protoc)。
*3. Motore:Volo 參考 Tower 設計的、使用了 GAT 和 TAIT 的 middleware 抽象層。
*4. Metainfo:Volo 用於進行元信息透傳的組件,期望定義一套元信息透傳的標準。
04 選型建議
“什麼情況下應該用 Rust、什麼情況下應該用 Go?” 這是一個非常經典的問題。在 Volo 團隊看來,Rust 和 Go 並不是對立關係,而是合作關係,取長補短。
對於性能不敏感的應用、重 IO 的應用以及需要快速開發快速迭代勝過穩定性的應用,推薦使用 Go,這種應用使用 Rust 並不會帶來明顯的收益。
對於 需要極致性能,重計算 的應用,以及 需要穩定性並能接受一定開發速度損失 的應用,推薦使用 Rust,Rust 在極致性能優化和安全性上的優勢可以在這類應用中得以發揮。
當然,還有一個很重要的考慮因素,是團隊現有的技術棧,即技術儲備和人才儲備。
05 總結
希望本文能讓大家對於 Volo 及相關生態有一個基本的瞭解。同時,Volo 還處於早期階段,歡迎各位感興趣的同學一起加入,共同建設 CloudWeGo 及 Rust 開源社區,向 Volo 提交 Issue 和 PR 共建 Volo。我們誠心期待更多的開發者加入,也期待 Volo 助力越來越多的企業快速構建雲原生架構。如果企業客戶想內部試用,我們可以排期提供專項技術支持和交流。
參考資料
Volo 概覽:
https://github.com/cloudwego/volo
Volo Tutorial:
https://www.cloudwego.io/zh/docs/volo/
Volo 文檔:
https://docs.rs/volo
Volo-rs 組織:
https://github.com/volo-rs
項目地址
GitHub:https://github.com/cloudwego
官網:www.cloudwego.io
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/XcceLyKxWOVtoMIJBuwXWQ