昆山住房與城鄉(xiāng)建設(shè)局網(wǎng)站重慶建設(shè)工程信息網(wǎng)三類(lèi)人員
鶴壁市浩天電氣有限公司
2026/01/24 08:53:08
昆山住房與城鄉(xiāng)建設(shè)局網(wǎng)站,重慶建設(shè)工程信息網(wǎng)三類(lèi)人員,車(chē)務(wù)網(wǎng)站開(kāi)發(fā),光環(huán)時(shí)訊網(wǎng)站說(shuō)實(shí)話(huà)#xff0c;在開(kāi)始這次測(cè)試之前#xff0c;我從來(lái)沒(méi)想過(guò)性能差異會(huì)這么大。作為一名有10年后端開(kāi)發(fā)經(jīng)驗(yàn)的程序員#xff0c;我一直覺(jué)得框架選擇主要看功能和生態(tài)#xff0c;性能嘛#xff0c;差不多就行了。直到上個(gè)月#xff0c;我們公司的一個(gè)項(xiàng)目因?yàn)椴l(fā)量上來(lái)…說(shuō)實(shí)話(huà)在開(kāi)始這次測(cè)試之前我從來(lái)沒(méi)想過(guò)性能差異會(huì)這么大。作為一名有10年后端開(kāi)發(fā)經(jīng)驗(yàn)的程序員我一直覺(jué)得框架選擇主要看功能和生態(tài)性能嘛差不多就行了。直到上個(gè)月我們公司的一個(gè)項(xiàng)目因?yàn)椴l(fā)量上來(lái)后服務(wù)器頻繁崩潰技術(shù)總監(jiān)讓我去調(diào)研一下到底該用什么框架我才真正開(kāi)始認(rèn)真對(duì)待這個(gè)問(wèn)題。那天晚上我在辦公室搭建測(cè)試環(huán)境同事還笑我說(shuō)你這是要當(dāng)性能測(cè)試工程師啊我當(dāng)時(shí)也沒(méi)多想就是覺(jué)得既然要選就得選個(gè)靠譜的。結(jié)果這一測(cè)測(cè)出了很多讓我意外的東西。關(guān)于Hyperlane框架在深入測(cè)試結(jié)果之前讓我先介紹一下這次測(cè)試中表現(xiàn)最出色的Hyperlane框架。Hyperlane是一個(gè)輕量級(jí)、高性能、跨平臺(tái)的 Rust HTTP 服務(wù)器框架構(gòu)建于 Tokio 異步運(yùn)行時(shí)之上。它的設(shè)計(jì)哲學(xué)是在提供完整Web框架功能的同時(shí)保持接近底層運(yùn)行時(shí)的性能水平。核心特性1. 卓越的性能表現(xiàn)Keep-Alive開(kāi)啟324,323 QPSKeep-Alive關(guān)閉51,031 QPS基于Tokio的零成本抽象無(wú)垃圾回收內(nèi)存使用穩(wěn)定2. 統(tǒng)一的編程模型HTTP、WebSocket、SSE使用相同的API統(tǒng)一的Context對(duì)象貫穿整個(gè)請(qǐng)求生命周期中間件和路由處理器使用相同的ServerHook trait3. 靈活的路由系統(tǒng)靜態(tài)路由精確匹配動(dòng)態(tài)路由支持參數(shù)捕獲如 /user/{id}正則路由支持復(fù)雜的路徑模式如 /file/{path:^.*$}4. 強(qiáng)大的中間件機(jī)制請(qǐng)求中間件request_middleware在路由處理前執(zhí)行響應(yīng)中間件response_middleware在路由處理后執(zhí)行Panic鉤子panic_hook優(yōu)雅處理運(yùn)行時(shí)錯(cuò)誤連接鉤子connected_hook處理連接建立事件5. 原生實(shí)時(shí)通信支持WebSocket完整的雙向通信支持自動(dòng)處理協(xié)議升級(jí)SSE服務(wù)器推送事件支持?jǐn)嗑€(xiàn)重連統(tǒng)一的send_body API無(wú)需學(xué)習(xí)不同的發(fā)送方式6. 跨平臺(tái)兼容Windows、Linux、macOS統(tǒng)一API平臺(tái)差異由框架內(nèi)部處理一次編寫(xiě)到處運(yùn)行快速開(kāi)始Hyperlane提供了官方的快速啟動(dòng)模板項(xiàng)目該模板展示了推薦的分層架構(gòu)app/controllerHTTP接口層app/service業(yè)務(wù)邏輯層app/mapper數(shù)據(jù)訪(fǎng)問(wèn)層app/model數(shù)據(jù)模型層param、dto、domain、persistent等app/middleware中間件層這種清晰的分層結(jié)構(gòu)不僅讓代碼更易維護(hù)也讓單元測(cè)試變得簡(jiǎn)單高效。為什么選擇Hyperlane性能無(wú)妥協(xié)在提供完整框架功能的同時(shí)保持了接近底層運(yùn)行時(shí)的性能開(kāi)發(fā)體驗(yàn)優(yōu)秀統(tǒng)一的API設(shè)計(jì)清晰的錯(cuò)誤處理完善的文檔生產(chǎn)就緒內(nèi)置服務(wù)管理、熱重啟、優(yōu)雅關(guān)閉等生產(chǎn)環(huán)境必需功能生態(tài)友好可以直接使用crates.io上的任何Rust庫(kù)類(lèi)型安全Rust的類(lèi)型系統(tǒng)在編譯期就能發(fā)現(xiàn)大量潛在問(wèn)題測(cè)試的起因事情要從我們公司的那個(gè)項(xiàng)目說(shuō)起。那是一個(gè)實(shí)時(shí)數(shù)據(jù)處理系統(tǒng)需要處理大量的 HTTP 請(qǐng)求。一開(kāi)始我們用的是 Node.js因?yàn)閳F(tuán)隊(duì)里大家都會(huì) JavaScript上手快。但是隨著用戶(hù)量增加服務(wù)器的 CPU 使用率經(jīng)常飆到百分之九十以上響應(yīng)時(shí)間也越來(lái)越慢。技術(shù)總監(jiān)問(wèn)我你覺(jué)得問(wèn)題出在哪我當(dāng)時(shí)想了想說(shuō)可能是 Node.js 單線(xiàn)程的問(wèn)題技術(shù)總監(jiān)搖搖頭不一定你去測(cè)測(cè)看對(duì)比一下不同的框架用數(shù)據(jù)說(shuō)話(huà)。就這樣我開(kāi)始了這次測(cè)試之旅。選擇測(cè)試對(duì)象首先我得確定要測(cè)試哪些框架。我在網(wǎng)上查了很多資料最后選了七個(gè)比較有代表性的第一個(gè)是 Tokio這是 Rust 生態(tài)里最核心的異步運(yùn)行時(shí)很多框架都是基于它構(gòu)建的。我選它主要是想看看純粹的異步運(yùn)行時(shí)能達(dá)到什么性能水平。第二個(gè)是Hyperlane框架一個(gè)基于 Tokio 的 Web 框架我在 GitHub 上找到的star 數(shù)不算特別多但是文檔寫(xiě)得很清楚而且聲稱(chēng)性能很好。當(dāng)時(shí)我還有點(diǎn)懷疑心想會(huì)不會(huì)是自吹自擂。第三個(gè)是 Rocket這個(gè)在 Rust 社區(qū)挺有名的很多人推薦新手用它入門(mén)。我想看看它的性能表現(xiàn)如何。第四個(gè)是 Rust 標(biāo)準(zhǔn)庫(kù)就是最原始的那種實(shí)現(xiàn)方式?jīng)]有任何框架封裝。這個(gè)主要是作為基準(zhǔn)線(xiàn)看看框架的封裝到底會(huì)帶來(lái)多少性能損耗。第五個(gè)是 GinGo 語(yǔ)言里最流行的 Web 框架之一。我們公司有個(gè)同事一直在用說(shuō)性能不錯(cuò)。第六個(gè)是 Go 標(biāo)準(zhǔn)庫(kù)和 Rust 標(biāo)準(zhǔn)庫(kù)一樣也是作為對(duì)比基準(zhǔn)。第七個(gè)就是我們項(xiàng)目原來(lái)用的 Node.js 標(biāo)準(zhǔn)庫(kù)了。測(cè)試環(huán)境的搭建搭建測(cè)試環(huán)境比我想象的要麻煩。首先是要保證測(cè)試的公平性所有框架都要在同樣的硬件和網(wǎng)絡(luò)環(huán)境下運(yùn)行。我用的是公司的一臺(tái)服務(wù)器配置還算不錯(cuò)八核 CPU十六G 內(nèi)存。然后是測(cè)試工具的選擇。我用了兩個(gè)工具wrk 和 ab。wrk 是一個(gè)現(xiàn)代化的 HTTP 壓測(cè)工具支持 Lua 腳本很靈活。ab 是 Apache 自帶的壓測(cè)工具雖然老了點(diǎn)但是很穩(wěn)定而且很多人都在用方便對(duì)比。測(cè)試場(chǎng)景我設(shè)計(jì)了兩種一種是開(kāi)啟 Keep-Alive模擬長(zhǎng)連接場(chǎng)景另一種是關(guān)閉 Keep-Alive模擬短連接場(chǎng)景。因?yàn)槲野l(fā)現(xiàn)很多人在討論性能的時(shí)候往往忽略了連接管理這個(gè)因素但實(shí)際上它對(duì)性能的影響非常大。第一輪測(cè)試Keep-Alive 開(kāi)啟第一輪測(cè)試我設(shè)置了三百六十個(gè)并發(fā)連接持續(xù)六十秒。這個(gè)并發(fā)量對(duì)于我們的項(xiàng)目來(lái)說(shuō)已經(jīng)算是比較高的了。測(cè)試開(kāi)始后我盯著屏幕上不斷跳動(dòng)的數(shù)字心里還挺緊張的。畢竟這是我第一次做這么正式的性能測(cè)試。結(jié)果出來(lái)后我愣了好幾秒。Tokio 跑出了340,130 QPS這個(gè)數(shù)字讓我有點(diǎn)震驚。我知道 Rust 性能好但沒(méi)想到能好到這個(gè)程度。然后是Hyperlane框架QPS 是324,323。說(shuō)實(shí)話(huà)這個(gè)結(jié)果讓我對(duì)它刮目相看。雖然比純 Tokio 稍微低一點(diǎn)但考慮到它提供了完整的 Web 框架功能這個(gè)性能已經(jīng)非常出色了。Rocket框架的 QPS 是298,945也很不錯(cuò)。Rust 標(biāo)準(zhǔn)庫(kù)是291,218這個(gè)結(jié)果有點(diǎn)出乎我的意料我原本以為標(biāo)準(zhǔn)庫(kù)會(huì)更快但實(shí)際上它反而比一些框架還慢。后來(lái)我想了想可能是因?yàn)闃?biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)比較基礎(chǔ)沒(méi)有做太多優(yōu)化。Gin框架的 QPS 是242,570Go 標(biāo)準(zhǔn)庫(kù)是234,178。這兩個(gè)結(jié)果在我的預(yù)期之內(nèi)Go 的性能一直都不錯(cuò)。最讓我意外的是 Node標(biāo)準(zhǔn)庫(kù)QPS 只有139,412。這個(gè)數(shù)字比我想象的要低很多。我當(dāng)時(shí)還以為是不是測(cè)試出了問(wèn)題又重新測(cè)了一遍結(jié)果還是差不多。我把這些數(shù)據(jù)記錄下來(lái)然后開(kāi)始分析。從數(shù)字上看Rust 系的框架明顯占據(jù)優(yōu)勢(shì)前四名都是 Rust 的。Go 系的框架表現(xiàn)中規(guī)中矩而 Node.js 則明顯落后。但這只是 QPS我還關(guān)注了延遲數(shù)據(jù)。Tokio 的平均延遲是一點(diǎn)二二毫秒那個(gè)基于 Tokio 的框架是一點(diǎn)四六毫秒Rocket 是一點(diǎn)四二毫秒。這些延遲都非常低用戶(hù)基本感覺(jué)不到。相比之下Node.js 的平均延遲是二點(diǎn)五八毫秒雖然也不算高但已經(jīng)是 Rust 框架的兩倍了。第二輪測(cè)試Keep-Alive 關(guān)閉第二輪測(cè)試我關(guān)閉了 Keep-Alive模擬短連接場(chǎng)景。這種場(chǎng)景下每個(gè)請(qǐng)求都需要重新建立 TCP 連接理論上會(huì)對(duì)性能有比較大的影響。測(cè)試參數(shù)還是三百六十個(gè)并發(fā)六十秒持續(xù)時(shí)間。結(jié)果出來(lái)后我發(fā)現(xiàn)了一個(gè)很有意思的現(xiàn)象。Hyperlane框架這次跑到了第一名QPS 是51,031。Tokio 本身是49,555Rocket框架是49,345。這個(gè)排名變化讓我很好奇。為什么在短連接場(chǎng)景下框架的表現(xiàn)反而超過(guò)了純 Tokio我仔細(xì)看了一下它的實(shí)現(xiàn)發(fā)現(xiàn)它在連接管理上做了很多優(yōu)化特別是在連接的創(chuàng)建和銷(xiāo)毀方面。Gin框架的 QPS 是40,149Go 標(biāo)準(zhǔn)庫(kù)是38,364。Rust 標(biāo)準(zhǔn)庫(kù)只有30,142這次它的表現(xiàn)確實(shí)不太理想。Node標(biāo)準(zhǔn)庫(kù)還是墊底QPS 只有28,286。而且測(cè)試過(guò)程中還出現(xiàn)了一些連接錯(cuò)誤穩(wěn)定性也不太好。從這兩輪測(cè)試的對(duì)比中我發(fā)現(xiàn)了一個(gè)規(guī)律在長(zhǎng)連接場(chǎng)景下底層運(yùn)行時(shí)的性能更重要但在短連接場(chǎng)景下框架層面的優(yōu)化反而能發(fā)揮更大的作用。第三輪測(cè)試ab 工具驗(yàn)證為了驗(yàn)證 wrk 的測(cè)試結(jié)果我又用 ab 工具做了一遍測(cè)試。這次我設(shè)置了一千個(gè)并發(fā)總共一百萬(wàn)個(gè)請(qǐng)求。ab 的測(cè)試結(jié)果和 wrk 基本一致這讓我對(duì)之前的數(shù)據(jù)更有信心了。在 Keep-Alive 開(kāi)啟的情況下Tokio 的 QPS 是308,596Hyperlane框架是307,568兩者幾乎持平。Rocket框架是267,931Rust 標(biāo)準(zhǔn)庫(kù)是260,514。Gin框架和 Go 標(biāo)準(zhǔn)庫(kù)分別是224,296和226,550。Node標(biāo)準(zhǔn)庫(kù)只有85,357而且失敗率很高一百萬(wàn)個(gè)請(qǐng)求里有八十多萬(wàn)失敗了。這個(gè)結(jié)果讓我有點(diǎn)震驚我沒(méi)想到在高并發(fā)場(chǎng)景下Node標(biāo)準(zhǔn)庫(kù)的表現(xiàn)會(huì)這么差。在 Keep-Alive 關(guān)閉的情況下Tokio 和Hyperlane框架依然領(lǐng)先QPS 分別是51,825和51,554。Rocket框架是49,621Go 系的框架是47,915和47,081。Node標(biāo)準(zhǔn)庫(kù)這次的表現(xiàn)稍微好一點(diǎn)QPS 是44,763但還是明顯落后于其他框架。數(shù)據(jù)背后的思考測(cè)試做完后我花了好幾天時(shí)間分析這些數(shù)據(jù)。我發(fā)現(xiàn)性能差異的背后其實(shí)反映了不同語(yǔ)言和框架的設(shè)計(jì)哲學(xué)。Rust 的性能優(yōu)勢(shì)主要來(lái)自于它的零成本抽象和內(nèi)存安全機(jī)制。它在編譯期就做了大量的優(yōu)化運(yùn)行時(shí)幾乎沒(méi)有額外開(kāi)銷(xiāo)。而且 Rust 的所有權(quán)系統(tǒng)保證了內(nèi)存的高效使用不需要垃圾回收這在高并發(fā)場(chǎng)景下是一個(gè)巨大的優(yōu)勢(shì)。Go 的性能也不錯(cuò)它的 goroutine 模型讓并發(fā)編程變得很簡(jiǎn)單。但是 Go 有垃圾回收在高并發(fā)場(chǎng)景下GC 的停頓會(huì)影響性能。我在測(cè)試過(guò)程中確實(shí)觀察到了一些延遲尖刺應(yīng)該就是 GC 造成的。Node.js 的問(wèn)題主要在于它的單線(xiàn)程模型。雖然它有事件循環(huán)和異步 I/O但在 CPU 密集型任務(wù)上表現(xiàn)不佳。而且 JavaScript 本身是一門(mén)動(dòng)態(tài)類(lèi)型語(yǔ)言運(yùn)行時(shí)需要做很多類(lèi)型檢查和轉(zhuǎn)換這也會(huì)影響性能。但讓我印象最深的還是Hyperlane框架。它在保持高性能的同時(shí)還提供了非常友好的 API 和完善的功能。我仔細(xì)研究了它的源碼發(fā)現(xiàn)它在很多細(xì)節(jié)上都做了優(yōu)化。比如說(shuō)它的中間件機(jī)制設(shè)計(jì)得很巧妙既保證了靈活性又沒(méi)有帶來(lái)太多性能損耗。它的路由系統(tǒng)支持靜態(tài)路由、動(dòng)態(tài)路由和正則表達(dá)式路由但查找效率很高。它還內(nèi)置了對(duì) WebSocket 和 SSE 的支持這些在實(shí)時(shí)應(yīng)用中非常有用。更重要的是它的連接管理做得很好。在短連接場(chǎng)景下它能夠快速地創(chuàng)建和銷(xiāo)毀連接不會(huì)造成資源泄漏。在長(zhǎng)連接場(chǎng)景下它又能夠高效地復(fù)用連接減少開(kāi)銷(xiāo)。實(shí)際應(yīng)用的考量測(cè)試數(shù)據(jù)很重要但實(shí)際應(yīng)用中還要考慮很多其他因素。首先是開(kāi)發(fā)效率。Rust 的學(xué)習(xí)曲線(xiàn)確實(shí)比較陡峭特別是所有權(quán)和生命周期的概念剛開(kāi)始很難理解。我自己學(xué) Rust 的時(shí)候光是搞懂借用檢查器就花了好幾周。但是一旦掌握了寫(xiě)出來(lái)的代碼質(zhì)量會(huì)很高而且編譯器會(huì)幫你發(fā)現(xiàn)很多潛在的問(wèn)題。Go 的學(xué)習(xí)曲線(xiàn)就平緩多了語(yǔ)法簡(jiǎn)單上手快。我們公司的同事說(shuō)他從零開(kāi)始學(xué) Go一周就能寫(xiě)出可用的項(xiàng)目了。Node.js 就更不用說(shuō)了JavaScript 大家都會(huì)而且生態(tài)非常豐富各種庫(kù)應(yīng)有盡有。其次是生態(tài)系統(tǒng)。Node.js 的 npm 生態(tài)是最成熟的幾乎任何功能都能找到現(xiàn)成的庫(kù)。Go 的生態(tài)也不錯(cuò)而且標(biāo)準(zhǔn)庫(kù)很強(qiáng)大很多功能不需要第三方庫(kù)就能實(shí)現(xiàn)。Rust 的生態(tài)相對(duì)年輕一些但發(fā)展很快。crates.io 上的包質(zhì)量普遍很高而且很多包都有詳細(xì)的文檔和示例。Hyperlane框架特別強(qiáng)調(diào)生態(tài)集成它可以直接使用 crates.io 上的任何包這一點(diǎn)我覺(jué)得很贊。再次是團(tuán)隊(duì)技能。如果團(tuán)隊(duì)里大家都熟悉 JavaScript那用 Node.js 可能是最快的選擇。如果團(tuán)隊(duì)有 Go 經(jīng)驗(yàn)?zāi)?Gin 也是個(gè)不錯(cuò)的選擇。但如果追求極致性能而且愿意投入時(shí)間學(xué)習(xí)那 Rust 系的框架絕對(duì)值得考慮。我的選擇經(jīng)過(guò)這次測(cè)試和分析我給技術(shù)總監(jiān)提交了一份詳細(xì)的報(bào)告。我的建議是對(duì)于我們公司的項(xiàng)目應(yīng)該考慮遷移到 Rust 系的框架。理由很簡(jiǎn)單我們的項(xiàng)目對(duì)性能要求很高而且會(huì)長(zhǎng)期維護(hù)。雖然 Rust 的學(xué)習(xí)成本高一點(diǎn)但長(zhǎng)期來(lái)看它帶來(lái)的性能提升和代碼質(zhì)量提升是值得的。技術(shù)總監(jiān)看了我的報(bào)告后問(wèn)了我一個(gè)問(wèn)題你覺(jué)得哪個(gè)框架最適合我們我想了想說(shuō)Hyperlane框架。它的性能數(shù)據(jù)很亮眼在 Keep-Alive 開(kāi)啟的情況下QPS 能達(dá)到324,323在關(guān)閉的情況下也有51,031。更重要的是它的 API 設(shè)計(jì)很友好文檔也很清楚上手不會(huì)太難。技術(shù)總監(jiān)點(diǎn)點(diǎn)頭那就試試看吧。遷移的過(guò)程接下來(lái)的兩周我開(kāi)始著手遷移工作。說(shuō)實(shí)話(huà)一開(kāi)始還挺忐忑的畢竟這是一個(gè)正在運(yùn)行的項(xiàng)目不能出問(wèn)題。我先搭建了一個(gè)測(cè)試環(huán)境把核心功能用新框架重寫(xiě)了一遍。讓我驚喜的是代碼量比原來(lái)的 Node.js 版本還少。這主要是因?yàn)?Rust 的類(lèi)型系統(tǒng)和模式匹配讓代碼更簡(jiǎn)潔而且框架提供的很多工具函數(shù)也很好用。比如說(shuō)處理 HTTP 請(qǐng)求和響應(yīng)原來(lái)在 Node.js 里需要寫(xiě)很多回調(diào)函數(shù)代碼嵌套很深。但在新框架里用 async/await 就能寫(xiě)得很清晰。中間件的使用也很方便。我需要添加一個(gè)日志中間件和一個(gè)認(rèn)證中間件只需要實(shí)現(xiàn)對(duì)應(yīng)的 trait然后注冊(cè)一下就行了。而且中間件的執(zhí)行順序很清楚不會(huì)出現(xiàn)那種莫名其妙的問(wèn)題。路由系統(tǒng)也讓我印象深刻。我們的項(xiàng)目有一些動(dòng)態(tài)路由比如根據(jù)用戶(hù) ID 獲取數(shù)據(jù)。在 Node.js 里我用的是 Express需要寫(xiě)一堆正則表達(dá)式。但新框架直接支持動(dòng)態(tài)路由寫(xiě)起來(lái)簡(jiǎn)單多了。WebSocket 的支持也很好。我們的項(xiàng)目需要實(shí)時(shí)推送數(shù)據(jù)給客戶(hù)端原來(lái)用的是 Socket.io。遷移到新框架后我發(fā)現(xiàn)它內(nèi)置的 WebSocket 支持就夠用了而且性能更好。上線(xiàn)后的表現(xiàn)測(cè)試環(huán)境跑了一周沒(méi)發(fā)現(xiàn)什么問(wèn)題我就開(kāi)始準(zhǔn)備上線(xiàn)了。上線(xiàn)那天我一直盯著監(jiān)控面板生怕出什么問(wèn)題。但事實(shí)證明我的擔(dān)心是多余的新系統(tǒng)運(yùn)行得非常穩(wěn)定。最明顯的變化是服務(wù)器的 CPU 使用率。原來(lái)用 Node.js 的時(shí)候CPU 經(jīng)常在百分之八十以上高峰期甚至?xí)桨俜种攀?。但換了新框架后CPU 使用率一直維持在百分之三十左右即使在高峰期也不超過(guò)百分之五十。響應(yīng)時(shí)間也有明顯改善。原來(lái)平均響應(yīng)時(shí)間是五十毫秒左右現(xiàn)在降到了十毫秒以?xún)?nèi)。用戶(hù)反饋說(shuō)系統(tǒng)變快了這讓我很有成就感。內(nèi)存使用也更穩(wěn)定了。Node.js 的內(nèi)存使用會(huì)隨著時(shí)間增長(zhǎng)需要定期重啟。但 Rust 沒(méi)有垃圾回收內(nèi)存使用一直很穩(wěn)定運(yùn)行一個(gè)月都不需要重啟。一些意外的收獲這次遷移還帶來(lái)了一些意外的收獲。首先是代碼質(zhì)量。Rust 的編譯器非常嚴(yán)格它會(huì)強(qiáng)制你處理所有可能的錯(cuò)誤情況。一開(kāi)始我覺(jué)得這很煩但后來(lái)發(fā)現(xiàn)這其實(shí)是好事。因?yàn)樗屇阍诰幾g期就發(fā)現(xiàn)問(wèn)題而不是等到運(yùn)行時(shí)才崩潰。我們?cè)瓉?lái)的 Node.js 代碼里有很多潛在的 bug比如沒(méi)有處理的異常、可能為 null 的變量等等。這些問(wèn)題在 Rust 里根本不可能通過(guò)編譯。其次是團(tuán)隊(duì)的技術(shù)成長(zhǎng)。雖然學(xué)習(xí) Rust 有一定難度但團(tuán)隊(duì)成員都覺(jué)得收獲很大。有個(gè)同學(xué)跟我說(shuō)學(xué)了 Rust 之后我對(duì)內(nèi)存管理和并發(fā)編程的理解深入了很多回頭再寫(xiě) JavaScript 都覺(jué)得更有把握了。再次是性能調(diào)優(yōu)的空間。Rust 提供了很多底層控制的能力如果需要進(jìn)一步優(yōu)化性能有很多可以調(diào)整的地方。而且 Rust 的性能分析工具也很好用比如火焰圖可以很直觀地看出性能瓶頸在哪里。對(duì)比其他項(xiàng)目的經(jīng)驗(yàn)后來(lái)我在網(wǎng)上看到一些其他人的性能測(cè)試報(bào)告發(fā)現(xiàn)我的測(cè)試結(jié)果和他們的基本一致。這讓我對(duì)自己的測(cè)試更有信心了。有個(gè)國(guó)外的開(kāi)發(fā)者做了一個(gè)更全面的測(cè)試他測(cè)試了二十多個(gè)框架結(jié)果顯示 Rust 系的框架確實(shí)在性能上有明顯優(yōu)勢(shì)。他還測(cè)試了一些其他指標(biāo)比如內(nèi)存使用、啟動(dòng)時(shí)間等Rust 框架在這些方面也表現(xiàn)不錯(cuò)。也有人質(zhì)疑說(shuō)這些性能測(cè)試都是在理想情況下做的實(shí)際應(yīng)用中可能達(dá)不到這個(gè)水平。這個(gè)觀點(diǎn)有一定道理但我覺(jué)得性能測(cè)試至少能說(shuō)明框架的性能上限在哪里。而且從我們項(xiàng)目的實(shí)際表現(xiàn)來(lái)看性能提升是實(shí)實(shí)在在的。一些建議基于這次經(jīng)驗(yàn)我想給其他同學(xué)一些建議。第一不要盲目追求性能。性能很重要但不是唯一的考量因素。如果你的項(xiàng)目并發(fā)量不高用什么框架其實(shí)差別不大。但如果你的項(xiàng)目對(duì)性能有較高要求那就值得花時(shí)間做一些測(cè)試和對(duì)比。第二要考慮團(tuán)隊(duì)的實(shí)際情況。如果團(tuán)隊(duì)對(duì)某個(gè)技術(shù)棧很熟悉那繼續(xù)用下去可能是最高效的選擇。但如果有機(jī)會(huì)學(xué)習(xí)新技術(shù)也不要害怕嘗試。第三要關(guān)注框架的長(zhǎng)期發(fā)展。一個(gè)框架不僅要性能好還要有活躍的社區(qū)、完善的文檔、穩(wěn)定的更新。這些因素在長(zhǎng)期維護(hù)中非常重要。第四要做充分的測(cè)試。不要只看別人的測(cè)試報(bào)告最好自己動(dòng)手測(cè)一測(cè)。因?yàn)椴煌膽?yīng)用場(chǎng)景性能表現(xiàn)可能會(huì)有很大差異。第五要關(guān)注細(xì)節(jié)。比如 Keep-Alive 的設(shè)置、連接池的配置、緩存策略等這些細(xì)節(jié)對(duì)性能的影響可能比框架本身還大。后續(xù)的探索這次測(cè)試之后我對(duì) Web 框架的性能優(yōu)化產(chǎn)生了濃厚的興趣。我開(kāi)始深入研究各種優(yōu)化技術(shù)比如零拷貝、內(nèi)存池、協(xié)程調(diào)度等。我還嘗試了一些其他的 Rust Web 框架比如 Actix-web、Warp 等。每個(gè)框架都有自己的特點(diǎn)和優(yōu)勢(shì)選擇哪個(gè)主要看具體需求。我也開(kāi)始關(guān)注一些新興的技術(shù)比如 HTTP/3、QUIC 協(xié)議等。這些新技術(shù)可能會(huì)在未來(lái)改變 Web 開(kāi)發(fā)的格局。寫(xiě)在最后回顧這次測(cè)試和遷移的經(jīng)歷我覺(jué)得最大的收獲不是找到了一個(gè)性能最好的框架而是學(xué)會(huì)了如何科學(xué)地評(píng)估和選擇技術(shù)。性能數(shù)據(jù)很重要但它只是決策的一個(gè)因素。我們還要考慮開(kāi)發(fā)效率、團(tuán)隊(duì)技能、生態(tài)系統(tǒng)、長(zhǎng)期維護(hù)等多個(gè)方面。技術(shù)選型沒(méi)有絕對(duì)的對(duì)錯(cuò)只有適合不適合。對(duì)于我們的項(xiàng)目來(lái)說(shuō)Hyperlane框架是一個(gè)很好的選擇。但對(duì)于其他項(xiàng)目可能 Go、Node.js 或者其他框架更合適。最重要的是要保持學(xué)習(xí)和探索的心態(tài)。技術(shù)在不斷發(fā)展今天的最佳實(shí)踐可能明天就過(guò)時(shí)了。只有不斷學(xué)習(xí)才能跟上技術(shù)的步伐。如果你也在做技術(shù)選型希望我的這次經(jīng)歷能給你一些參考。記住數(shù)據(jù)不會(huì)說(shuō)謊但也不要被數(shù)據(jù)束縛。要結(jié)合實(shí)際情況做出最適合自己的選擇。測(cè)試過(guò)程中我用的Hyperlane框架在 Keep-Alive 開(kāi)啟時(shí)能達(dá)到324,323 QPS在關(guān)閉時(shí)也有51,031 QPS。這個(gè)性能水平在 Rust 生態(tài)里算是頂尖的了而且它的 API 設(shè)計(jì)、文檔質(zhì)量、生態(tài)集成都做得很好。如果你對(duì)這個(gè)框架感興趣可以去它的 GitHub 主頁(yè)看看那里有詳細(xì)的文檔和示例。我相信你會(huì)和我一樣被它的設(shè)計(jì)理念和性能表現(xiàn)所吸引。技術(shù)的世界很大值得我們?nèi)ヌ剿鞯臇|西還有很多。希望我們都能在這條路上走得更遠(yuǎn)。項(xiàng)目地址https://github.com/hyperlane-dev/hyperlane作者聯(lián)系rootltpp.vip