国产精一区二区_午夜视频99_免费白白视频_中文字幕一区免费

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

CSDN
+ 關(guān)注
2022-11-24 16:15
1218次閱讀

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

摘要:團(tuán)隊(duì)用 7 個(gè)月寫(xiě)了 27 萬(wàn)行 C++ 代碼,為什么突然要用 Rust 重寫(xiě),來(lái)看數(shù)據(jù)庫(kù)創(chuàng)業(yè)公司 RisingWave Labs 創(chuàng)始人兼首席執(zhí)行官吳英駿博士的現(xiàn)身說(shuō)法。

鏈接:https://medium.com/@Aaron0928/the-founder-of-the-database-rewrite-with-rust-is-back-was-it-worth-deleting-270-000-lines-of-c-46a8713bd8e6

聲明:本文為 CSDN 翻譯,未經(jīng)允許禁止轉(zhuǎn)載。

者 | Aaron 0928       
譯者 | 彎月     責(zé)編 | 鄭麗媛
出品 | CSDN(ID:CSDNnews)

前段時(shí)間,數(shù)據(jù)庫(kù)創(chuàng)業(yè)公司 RisingWave Labs 發(fā)表博文,宣布徹底刪除RisingWave(該公司的云原生流數(shù)據(jù)庫(kù))的 27 萬(wàn)行 C++ 代碼,并用 Rust 語(yǔ)言重寫(xiě)。

為此,我們采訪(fǎng)了該公司的創(chuàng)始人兼首席執(zhí)行官吳英駿博士,詳細(xì)探討了重寫(xiě)的前中后期準(zhǔn)備工作、遇到的問(wèn)題以及經(jīng)驗(yàn)教訓(xùn)。

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

放棄 Rust,最初的選擇是 C++

提問(wèn):選擇哪種編程語(yǔ)言與 RisingWave 的功能有關(guān)系嗎?

吳英駿:RisingWave 是一款云原生流式數(shù)據(jù)庫(kù),主要服務(wù)于需要超低延遲實(shí)時(shí)的數(shù)據(jù)分析應(yīng)用。其定位不僅是一個(gè) SQL 數(shù)據(jù)庫(kù)系統(tǒng),還提供流處理能力:使用流數(shù)據(jù)執(zhí)行連續(xù)查詢(xún),并以物化視圖的形式動(dòng)態(tài)維護(hù)結(jié)果。另外,RisingWave 采用了分層架構(gòu),建立在現(xiàn)代云基礎(chǔ)設(shè)施之上,利用云資源為用戶(hù)提供成本和性能的細(xì)粒度控制。

這個(gè)架構(gòu)最大的特點(diǎn)在于,資源是無(wú)限的。由于有無(wú)限的資源,性能就不會(huì)成為特別大的問(wèn)題——只要添加資源,性能就能提到提升。但資源是收費(fèi)的,設(shè)備也是收費(fèi)的,我們希望能在保證用戶(hù)性能的前提下,降低整個(gè)系統(tǒng)的成本,讓普通用戶(hù)以較為低廉的價(jià)格使用我們的服務(wù),這也是我們的核心設(shè)計(jì)理念。

這與編程語(yǔ)言的選擇沒(méi)有太大關(guān)系,開(kāi)發(fā)一款數(shù)據(jù)庫(kù)可以使用各種各樣的語(yǔ)言,比如 C++、Rust、Java,Scala 等,一些交易系統(tǒng)可能還會(huì)考慮 Haskell。不過(guò)即便是二十年前,也很少有人用 Java 、Basic、Python 這類(lèi)語(yǔ)言構(gòu)建數(shù)據(jù)庫(kù),主要因?yàn)檫@些語(yǔ)言的運(yùn)行效率和性能均不高。

因此,我們主要希望選擇一門(mén)高性能的編程語(yǔ),而所謂的高性能語(yǔ)言不外乎 C++、Rust 或者一些小眾語(yǔ)言,如果又想被用戶(hù)廣泛接受,那基本上就是 C++ 和 Rust。

提問(wèn):據(jù)了解,你們團(tuán)隊(duì)最初選擇的是 C++,還集結(jié)了多位擁有 10 年以上經(jīng)驗(yàn)的 C++ 工程師。當(dāng)初你們是看中了 C++ 的哪些特質(zhì),還是說(shuō)你們只是遵從了市場(chǎng)上大部分?jǐn)?shù)據(jù)庫(kù)系統(tǒng)的選擇?

吳英駿:我本人比較擅長(zhǎng) C++,不管是讀博期間還是創(chuàng)業(yè)之前開(kāi)發(fā)的所有數(shù)據(jù)庫(kù)都是用 C++ 編寫(xiě)的,我沒(méi)有用其他任何語(yǔ)言寫(xiě)過(guò)項(xiàng)目。

創(chuàng)業(yè)之初,有人提議使用 Rust,理由是 Rust 很火。但在我看來(lái),這算不上一個(gè)充分理由,我們又不是想成為網(wǎng)紅,選擇一門(mén)語(yǔ)言不能僅僅是為了火,我們需要考慮哪種語(yǔ)言適合團(tuán)隊(duì),以及數(shù)據(jù)庫(kù)領(lǐng)域的通用語(yǔ)言是什么。在數(shù)據(jù)庫(kù)領(lǐng)域,雖然 TiDB 的存儲(chǔ)引擎 TiKV 是用 Rust 寫(xiě)的,但這不足以證明用 Rust 寫(xiě)數(shù)據(jù)庫(kù)系統(tǒng)都能成功,相反絕大多數(shù)成功的數(shù)據(jù)庫(kù)系統(tǒng)都是用 C++ 編寫(xiě)的。

從招聘的角度來(lái)看,我們肯定希望招募到數(shù)據(jù)庫(kù)領(lǐng)域的專(zhuān)家,而擁有多年數(shù)據(jù)庫(kù)領(lǐng)域經(jīng)驗(yàn)的專(zhuān)家大多來(lái)自如今的主流數(shù)據(jù)庫(kù)提供商——這些數(shù)據(jù)庫(kù)也基本都是用 C++ 寫(xiě)的。

相較而言,Rust 是一門(mén)比較年輕的語(yǔ)言,缺少重量級(jí)項(xiàng)目。盡管實(shí)際上很多項(xiàng)目都使用了Rust,其中一些還是相對(duì)流行的項(xiàng)目,但還算不上重量級(jí)的大工程,生態(tài)系統(tǒng)或多或少有些不足。

綜上,最終我們決定使用 C++ 作為主要開(kāi)發(fā)語(yǔ)言。

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

選擇用 Rust 重寫(xiě)

提問(wèn):你們團(tuán)隊(duì)已經(jīng)在這個(gè)項(xiàng)目上投入了 7 個(gè)多月,你也提到時(shí)間對(duì)于創(chuàng)業(yè)公司而言是非常寶貴的,是因?yàn)槭裁雌鯔C(jī)讓你們覺(jué)得不重寫(xiě)不行了?

吳英駿:首先,C++ 比較常見(jiàn)的問(wèn)題是內(nèi)存泄漏,但這類(lèi) Bug 比較容易修復(fù),我們覺(jué)得可以忍。其次,依賴(lài)管理很痛苦,雖然 CMake 工具可以自動(dòng)配置 C++ 項(xiàng)目的編譯,但使用起來(lái)還是很麻煩,我們?nèi)匀恍枰謩?dòng)配置并安裝依賴(lài)庫(kù);STL 庫(kù)缺乏對(duì)一些現(xiàn)代編程工具的支持,依賴(lài)的社區(qū)項(xiàng)目大多數(shù)還缺乏長(zhǎng)期支持。最后,我們招聘到的成員 C++ 水平參差不棄,每個(gè)人都有自己的風(fēng)格,非常難以統(tǒng)一,導(dǎo)致閱讀代碼的難度過(guò)大,審查代碼更是勞心勞力。隨著越來(lái)越多人員的加入,C++ 問(wèn)題暴露得越來(lái)越頻繁,在此期間不斷有工程師提出是否可以考慮用 Rust 重寫(xiě)。

另外,流式數(shù)據(jù)庫(kù)通常用于處理對(duì)延遲非常敏感的關(guān)鍵性任務(wù)。因此,構(gòu)建 RisingWave 的編程語(yǔ)言必須滿(mǎn)足以下要求:保證零成本抽象,不能有性能上限;不需要運(yùn)行時(shí)垃圾收集,可以控制由內(nèi)存管理引起的延遲峰值。

起初,我們并不想更換語(yǔ)言,畢竟已經(jīng)寫(xiě)了這么久。但最終我們決定,如果支持用 Rust 重寫(xiě)的工程師可以成功重寫(xiě)一個(gè)獨(dú)立的模塊,我們就考慮重寫(xiě)整個(gè)數(shù)據(jù)庫(kù)。與此同時(shí),我也想起之前在 AWS Redshift 工作中遇到的一個(gè) Bug,三個(gè)人不斷調(diào)試了兩周都無(wú)解,最終發(fā)現(xiàn)是內(nèi)存泄漏的問(wèn)題。如果現(xiàn)在項(xiàng)目繼續(xù)下去很可能也會(huì)遇到類(lèi)似的情景,假設(shè)那時(shí)產(chǎn)品已經(jīng)有了很多用戶(hù),我們還需要因?yàn)檫@種內(nèi)存泄露的問(wèn)題調(diào)試許久,那就得不償失了。所以就在那個(gè)時(shí)候,我們開(kāi)始認(rèn)真考慮是否要用 Rust 重寫(xiě)。

經(jīng)過(guò)慎重評(píng)估,我們需要花費(fèi)大約兩個(gè)月的時(shí)間就可以用 Rust 重寫(xiě)原來(lái)七個(gè)月寫(xiě)的代碼,這個(gè)時(shí)間差主要是由于項(xiàng)目的邏輯框架已在項(xiàng)目前期梳理清楚。暑假期間公司招了大量實(shí)習(xí)生,人手比較充足,且很多實(shí)習(xí)生都有 Rust 的基礎(chǔ),這些都提升了重寫(xiě)的速度。最后,經(jīng)過(guò)全公司的表決投票,我們開(kāi)始重寫(xiě)。

在替換的過(guò)程中,我們選擇逐個(gè)模塊替換,這也保證了整個(gè)過(guò)程不會(huì)出現(xiàn)很?chē)?yán)重的問(wèn)題。

提問(wèn):用 Rust 重寫(xiě)以后,C++ 代碼風(fēng)格不統(tǒng)一的問(wèn)題得到解決了嗎?

吳英駿:風(fēng)格不統(tǒng)一的問(wèn)題肯定不是用 Rust 就能解決的,但相對(duì) C++ 會(huì)有很大程度的改善。C++ 中關(guān)于指針等的寫(xiě)法很難統(tǒng)一,還容易造成安全性的問(wèn)題。

提問(wèn):C++ 中一些語(yǔ)言層面的缺陷由來(lái)已久,在使用 C++ 作為主要開(kāi)發(fā)語(yǔ)言之前,你沒(méi)有遇到過(guò)上述問(wèn)題嗎?

吳英駿:我之前也遇到過(guò),但在我上學(xué)期間,Rust 還不完善,用戶(hù)很少,因此不會(huì)考慮到用 Rust 去開(kāi)發(fā)數(shù)據(jù)庫(kù)。此外,我之前接觸的數(shù)據(jù)庫(kù)都是比較成熟的產(chǎn)品,比如 IBM DB2,所以我的大部分工作時(shí)間都在調(diào)試,很難有精力和時(shí)間去重寫(xiě)一個(gè)誕生于幾十年前的數(shù)據(jù)庫(kù)。

在大型企業(yè)內(nèi)部,只有不太重要的項(xiàng)目或者用戶(hù)數(shù)量不多的項(xiàng)目才有可能被重寫(xiě),否則就需要投入大量的精力和資源。對(duì)于起步階段的創(chuàng)業(yè)公司來(lái)說(shuō),還是有機(jī)會(huì)重寫(xiě)的,一旦面對(duì)客戶(hù)交付的壓力,重寫(xiě)就不太可能了。

提問(wèn):在重寫(xiě)之前,系統(tǒng)已經(jīng)完成了多少?

吳英駿:簡(jiǎn)單來(lái)說(shuō),框架已是比較清晰的水平。重寫(xiě)不至于發(fā)現(xiàn)之前的 Bug,但通過(guò)重寫(xiě),我們確實(shí)會(huì)考量各個(gè)部分設(shè)計(jì)的合理性。

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

Rust 的優(yōu)勢(shì)

提問(wèn):Rust 有哪些有優(yōu)勢(shì)?

吳英駿:首先,安全性絕對(duì)是一大優(yōu)勢(shì),這對(duì)數(shù)據(jù)庫(kù)項(xiàng)目非常重要。其次,包管理需要的工作量非常少,C++ 有非常多的庫(kù),包管理非常復(fù)雜,你需要花費(fèi)幾個(gè)小時(shí)才能搞清楚如何在 CMake 里面配置一個(gè)包管理工具,即便在配置之后也需要花費(fèi)很多時(shí)間,比如無(wú)法安裝,還可能遇到重名的問(wèn)題(其他項(xiàng)目中使用的變量名稱(chēng)與我們庫(kù)中的名字重合了),這些問(wèn)題都需要手動(dòng)解決,而且改起來(lái)費(fèi)時(shí)費(fèi)力。

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

重寫(xiě)的收益

提問(wèn):重寫(xiě)前后的收益情況如何?

吳英駿:一句話(huà)總結(jié):收益巨大。從收益比的角度看,我們損失的是時(shí)間,因?yàn)榉侄沃貙?xiě)大概花費(fèi)了一個(gè)月左右,但這些時(shí)間并沒(méi)有白白浪費(fèi),這個(gè)過(guò)程讓我們又反思了一遍不同模塊的設(shè)計(jì)思路,改掉了其中不合理的部分。對(duì)數(shù)據(jù)庫(kù)系統(tǒng)而言,這是一個(gè)長(zhǎng)周期的項(xiàng)目,早期孵化階段時(shí)間的寶貴程度和正式上線(xiàn)后肯定是有區(qū)別的。當(dāng)對(duì)象是直接用戶(hù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)出現(xiàn)任何問(wèn)題都是不能忍的。

我們收獲的是系統(tǒng)更加穩(wěn)定、安全,且代碼清晰,尤其是包管理部分有非常大的提升。此外,Rust 本身在高速發(fā)展中,整個(gè)社區(qū)非常有活力,提問(wèn)基本都能夠得到及時(shí)回復(fù),這是 Rust 生態(tài)系統(tǒng)帶給我們的優(yōu)勢(shì)。

刪除 27 萬(wàn)行 C++ 代碼,轉(zhuǎn)用 Rust 重寫(xiě)數(shù)據(jù)庫(kù),真的值得嗎?

使用 Rust 重寫(xiě)代碼的注意事項(xiàng)

提問(wèn):重寫(xiě)之后,原來(lái)那批 C++ 工程師都自學(xué)了 Rust 嗎?

吳英駿:團(tuán)隊(duì)中的部分工程師之前就掌握了 Rust,只是未在工作中使用,這部分工程師還是比較容易轉(zhuǎn)換的。我們也專(zhuān)門(mén)讓一些工程師評(píng)估從零開(kāi)始學(xué) Rust 需要多久,絕大多數(shù)工程師基本能夠在一個(gè)月之內(nèi)掌握 Rust,但還達(dá)不到全面掌握,只是可以使用 Rust 寫(xiě)一些代碼。

整個(gè)過(guò)程比較順利,因?yàn)椴糠止こ處煏?huì)利用業(yè)余時(shí)間自學(xué) Rust,并將經(jīng)驗(yàn)傳播給其他人,這是非常重要的。我認(rèn)為,如果公司決定重寫(xiě),那么公司內(nèi)部必須有一到兩位,甚至更多位擁有 Rust 實(shí)戰(zhàn)經(jīng)驗(yàn)的工程師,或者至少愿意利用業(yè)余時(shí)間學(xué)習(xí),并將經(jīng)驗(yàn)傳授給其他人,這可以降低整個(gè)公司的學(xué)習(xí)難度,畢竟 Rust 的學(xué)習(xí)曲線(xiàn)是比較陡峭的。

提問(wèn):擁有其他編程語(yǔ)言基礎(chǔ)對(duì)于學(xué)習(xí) Rust 有影響嗎?

吳英駿:會(huì)有差異,而且比較明顯。對(duì)于其他語(yǔ)言,比如 Python,最大的特點(diǎn)是簡(jiǎn)化編程,開(kāi)發(fā)人員不需要考慮內(nèi)存管理等問(wèn)題,但 Rust 需要這方面的基礎(chǔ),所以擁有不同的語(yǔ)言背景,對(duì)于學(xué)習(xí) Rust 的成本有不同的影響。

提問(wèn):Rust 一直存在編譯時(shí)的問(wèn)題,你們有感受到嗎?

吳英駿:Rust 確實(shí)存在編譯時(shí)問(wèn)題,但 C++ 的編譯相對(duì)也很慢,所以目前還可以忍受。如果編譯時(shí)間過(guò)長(zhǎng),工程師會(huì)定期查看編譯過(guò)程,并嘗試是否有辦法可以縮短這個(gè)時(shí)間。

提問(wèn):你會(huì)建議什么類(lèi)型的公司或者業(yè)務(wù)團(tuán)隊(duì)在什么情況下選擇重寫(xiě)代碼庫(kù)?

吳英駿:如果是大型公司內(nèi)部選擇重寫(xiě),大概率表明項(xiàng)目本身不是那么重要,或者是核心項(xiàng)目的邊緣模塊,用戶(hù)沒(méi)有那么多、公司又有錢(qián)、有資源、有人力,這種情況下可以考慮重寫(xiě)。對(duì)于創(chuàng)業(yè)公司而言,早期還有精力重寫(xiě),一旦用戶(hù)量上來(lái)就會(huì)面臨交付壓力,基本不太會(huì)做這種決定。

此外,你需要搞清楚換編程語(yǔ)言的理由,出于性能、安全性或者其他原因,而不只是因?yàn)槟撤N語(yǔ)言很火。以數(shù)據(jù)庫(kù)領(lǐng)域?yàn)槔F(xiàn)在很多成功的數(shù)據(jù)庫(kù)誕生距今已有十年以上,經(jīng)歷了長(zhǎng)時(shí)間的磨煉,其實(shí)轉(zhuǎn) Rust 的需求并不大。總的來(lái)說(shuō),我認(rèn)為考慮實(shí)際的需求非常重要,你需要綜合考慮再做決定。

提問(wèn):你覺(jué)得目前 Rust 的生態(tài)環(huán)境如何?

吳英駿:整體來(lái)看 Rust 的生態(tài)環(huán)境比較不錯(cuò),主要問(wèn)題在于缺少大型項(xiàng)目驗(yàn)證,比如 Go 最成功的項(xiàng)目是 Kubernetes。但我們也看到不少科技公司考慮使用 Rust 重寫(xiě)某些服務(wù),比如 InnoDB,也看到很多公司加入了 Rust 基金會(huì),比如 AWS、Google、Facebook 等。我相信,有了這些公司的長(zhǎng)期支持,未來(lái)會(huì)出現(xiàn)一些非常不錯(cuò)的項(xiàng)目,Rust 會(huì)變得越來(lái)越好。

提問(wèn):選擇用 Rust 重寫(xiě)與團(tuán)隊(duì)規(guī)模和狀態(tài)之間是否有關(guān)系?

吳英駿:我覺(jué)得重寫(xiě)和團(tuán)隊(duì)規(guī)模的關(guān)系不是很大,但我更建議年輕的團(tuán)隊(duì)選擇 Rust,當(dāng)然這也因人而異。至于最終是否要轉(zhuǎn),也要考慮團(tuán)隊(duì)大多數(shù)人的意見(jiàn),因?yàn)樵趯W(xué)習(xí)了一段時(shí)間之后,發(fā)現(xiàn)還是沒(méi)有熟練掌握 Rust 可能會(huì)有很強(qiáng)的挫敗感,這需要團(tuán)隊(duì)成員的共同努力,僅憑興趣很難做好。此外,僅憑興趣決定創(chuàng)業(yè)以及對(duì)外提供商業(yè)化服務(wù),這也是非常不負(fù)責(zé)的。

本文來(lái)自微信公眾號(hào)“CSDN”(ID:CSDNnews),36氪經(jīng)授權(quán)發(fā)布。

資深作者CSDN
0
相關(guān)文章
最新文章
查看更多
關(guān)注 36氪企服點(diǎn)評(píng) 公眾號(hào)
打開(kāi)微信掃一掃
為您推送企服點(diǎn)評(píng)最新內(nèi)容
消息通知
咨詢(xún)?nèi)腭v
商務(wù)合作