【活動回顧】Rust:構(gòu)建新時代基礎設施的首選語言 @Qcon

以「啟航 ? AIGC 軟件工程變革」為主題的 QCon 全球軟件開發(fā)大會北京站于 9 月 5 日在北京富力萬麗酒店圓滿落幕!此次大會包含向量數(shù)據(jù)庫、云原生、異構(gòu)計算、面向 AI 的存儲、微服務架構(gòu)治理、FinOps 等近?30 個精彩專題。Databend Labs 作為深耕云原生數(shù)據(jù)庫領域的科技公司受邀參與。
9月3日下午,Databend 研發(fā)工程師 - 邰翀作為「構(gòu)建未來軟件的編程語言」專題的演講嘉賓參與本次分享。

主題: 「Rust:構(gòu)建新時代基礎設施的首選語言」
演講嘉賓: 邰翀
嘉賓介紹: Databend 研發(fā)工程師
本次分享聚焦于數(shù)據(jù)庫和 AI 領域,從跨云數(shù)據(jù)訪問和向量數(shù)據(jù)庫的現(xiàn)實需求談起,闡述為什么 Rust 是適合于新時代基礎設施的編程語言,并分析 Rust 在新時代基礎設施下的新機遇。本次分享主要分為三個部分:
Rust 新時代基礎設施的最佳選擇
All in Rust 為 Databend 帶來了什么
Rust 如何成為構(gòu)建 Vector Embeddings 的關鍵語言
Rust 的機遇與挑戰(zhàn)
Rust?新時代基礎設施的最佳選擇
在此前,當我們談論基礎設施時,首先可能會想到服務器、Oracle 等。而近些年來,我們談論基礎設施已經(jīng)離不開云和構(gòu)建在云上的各種服務。
新時代基礎設施是指:可以在云上自由部署、與云完美融合的基礎設施。在這個新時代中,Databend 和一些數(shù)據(jù)庫同行都選擇了 Rust 作為首選語言。我們可以觀察到 amazom、 微軟、Firefox、飛書、TiKV、云數(shù)倉 Databend、OpenDAL 等公司或者項目在使用 Rust?。

Rust 的發(fā)展時間線
2006 年, Graydon Hoare 著手設計和實現(xiàn) Rust 語言,此時,還只是他的個人項目。
2009 年,Mozilla 開始贊助這個項目,并成立團隊支持 Rust 的開發(fā)。
2010 年,Rust 首次公開,并在一年后實現(xiàn)了編譯器自舉,到 2015 年發(fā)布了第一個穩(wěn)定版本。
2021 年,Rust 基金會成立,為 Rust 語言帶來更廣闊的發(fā)展前景。
Rust 與內(nèi)存安全
Rust 的創(chuàng)始人 Graydon Hoare 曾經(jīng)說過:“Rust是一種采用過去的知識解決將來的問題的技術。”
在我的理解中,Rust 的主要目標之一就是解決內(nèi)存安全問題。
下面列出一些常見的內(nèi)存安全問題:
Out-Of-Bound : 假設有兩個線程,其中一個線程在訪問鏈表,另一個線程在進行刪除,這個時候可能會產(chǎn)生越界問題。
Use After Free : 指針指向了堆上一塊內(nèi)存,但是這塊內(nèi)存因為擴容或者其他原因?qū)е轮胤峙洌o了惡意代碼修改并且執(zhí)行被釋放內(nèi)存的機會。
通用手法
針對內(nèi)存安全問題,不同的編程語言都會提出自己的一套解決方案,目前通用的方式包括:
垃圾回收(Garbage Collection,GC) :設立專門的垃圾回收機制來檢測內(nèi)存。由于回收機制的時間不固定,這種方式可能會導致內(nèi)存不可控。對于數(shù)據(jù)庫軟件而言,如果在做大量數(shù)據(jù)的聚合相加,可能會導致內(nèi)存飆升,并且很長時間無法釋放,容易誘發(fā) OOM 。
自動引用計數(shù)(Automatic Reference Counting,ARC) :可以自動地跟蹤和管理對象的引用計數(shù),從而避免了手動管理內(nèi)存的繁瑣和容易出錯的問題,算是一種比較好的方式。
手動管理內(nèi)存(Manualy Handle Memory) :開發(fā)者自行管理分配和釋放,對程序開發(fā)功底要求比較高。
Rust 怎么做
上面的三種通用手法是通過管理引用來處理內(nèi)存安全問題的,而 Rust 則選擇通過限制引用行為來解決內(nèi)存安全問題。 更具體地,Rust 引入了所有權(quán)、借用檢查和生命周期這三個重要的概念。
所有權(quán)(Ownership) :每個值只能有一個所有者。
借用檢查(Borrow Check) :幫助管理所有權(quán)的一套規(guī)則,能夠處理內(nèi)存分配和釋放,防止數(shù)據(jù)競爭。
生命周期(Lifetimes) :程序中每個變量都有一個固定的作用域,當超出變量的作用域以后,變量就會被銷毀。變量在作用域中從初始化到銷毀的整個過程稱之為生命周期。
Rust :最受程序員推崇的語音
正因為 Rust 語言表現(xiàn)力、卓越的性能以及自己獨有一套的內(nèi)存管理方式,蟬聯(lián)八屆 Stack Overflow Developer Survey 最受程序員推崇的語言。

All in Rust??為 Databend?帶來了什么
Databend Labs 成立于 2021 年 3 月,是一家開源 Data Cloud 服務商,致力于為大數(shù)據(jù)生態(tài)提供堅實可靠的基礎設施。我們的核心團隊成員來自 ClickHouse 社區(qū)、谷歌 Anthos、阿里云等國內(nèi)外知名互聯(lián)網(wǎng)和云計算公司,團隊在云原生數(shù)據(jù)庫領域有著豐富的工程經(jīng)驗,同時也是數(shù)據(jù)庫開源社區(qū)活躍貢獻者。
我們在用 Rust 做什么?
Databend是一款使用 Rust 研發(fā)、開源、彈性、低成本,基于對象存儲也可以做實時分析的新式數(shù)倉,具有即時擴縮容能力,能在數(shù)分鐘內(nèi)增加數(shù)百倍的算力,為企業(yè)提供了一個用于存儲、管理和分析大量數(shù)據(jù)的集中式平臺,從而助力企業(yè)更準確地洞察業(yè)務、制定戰(zhàn)略。

除了 Databend 之外,我們也使用 Rust 開發(fā)和維護了大量項目:
OpenRaft 是在 tokio 之上實現(xiàn)的異步 Raft 框架,在 leadership 上做了大量優(yōu)化,性能非常強勁。
BendSQL 是基于 Databend HTTP API 和 Arrow Flight API 設計和實現(xiàn)的原生客戶端。
AskBend 是一款知識庫智能問答系統(tǒng),基于 OpenAI 的 API 并且利用 Databend 內(nèi)置的一系列 SQL 函數(shù)(AI Functions)打造。訪問鏈接:https://ask.databend.rs 即可體驗。
OpenDAL 提供一個統(tǒng)一、簡單、高效、可靠、可觀察的數(shù)據(jù)訪問層,讓開發(fā)者可以無縫地使用不同的存儲服務,并享受到最佳的用戶體驗。今年 3 月份的時候已經(jīng)移交到 Apache 軟件基金會孵化器中進行孵化。
Rust 給我們帶來了什么?
數(shù)據(jù)庫本身就是計算機科學皇冠上的一顆明珠,是一個龐大而又復雜的系統(tǒng)。而在 Databend 的設計和實現(xiàn)中,我們還從目前市場上最優(yōu)秀的數(shù)倉中借鑒了一些經(jīng)驗。例如,我們參考了 Clickhouse 的向量化設計,以提高單機的性能。同時,我們也借鑒了 Snowflake 的集群優(yōu)點,以增強分布式計算能力。
選擇 Rust 作為這樣一個復雜系統(tǒng)開發(fā)的首選語言,我們收獲了這些:
高效 的研發(fā) : 雖然 Databend 從第一版發(fā)布至今只有 2 年多,但從開源到文章撰寫時為止,已經(jīng)累計有 8000 多個 PR 。
優(yōu)越 的 性能: Databend 在 Clickbench 基準測試中,數(shù)據(jù)導入性能排名第一,并且在 c6a.4xlarge 機型性能登頂,除了優(yōu)秀的設計和實現(xiàn)之外,Rust 功不可沒。
活躍的 社區(qū): 得益于 Rust 語言的流行和社區(qū)的持續(xù)關注,到文章撰寫時為止已有超過 200 位貢獻者,收獲 6.5 k star ,是 Rust 社區(qū)中的明星項目之一。

Rust?如何成為構(gòu)建 Vector?Embeddings 的關鍵語言
同樣是數(shù)據(jù)庫領域,現(xiàn)在讓我們將目光轉(zhuǎn)向今年在 AI 上大放異彩的向量數(shù)據(jù)庫。
向量嵌入(Vector Embeddings)可以將數(shù)據(jù)轉(zhuǎn)化為一個包含其實際含義的向量空間。而向量數(shù)據(jù)庫則致力于挖掘存儲和處理向量數(shù)據(jù)的能力,并提供高效的向量檢索功能。
為什么需要向量數(shù)據(jù)庫
對于 GPT 這樣的大模型而言,Tokens 大小限制了應用的進一步開發(fā),而引入向量數(shù)據(jù)庫之后,就可以利用向量檢索和向量索引能力,相似度更近的數(shù)據(jù)緊湊存放。這樣可以帶來兩個方面的好處:
降低 GPT 的使用成本。
維護長期記憶,幫助 AI 理解和執(zhí)行復雜任務。
Rust 如何進入向量數(shù)據(jù)庫
讓我們一起來看一下 Rust 是怎么進入到向量數(shù)據(jù)庫領域的:
研發(fā)新的向量數(shù)據(jù)庫: 獲得知名投資機構(gòu) YC 的青睞的 LanceDB ?使用 Rust 設計了針對向量數(shù)據(jù)庫的存儲格式。
重寫現(xiàn)有向量數(shù)據(jù)庫: Pinecone 將 C++ 和 Python 代碼庫使用 Rust 完全重寫。在今年 5 月份獲得 a16z 一億美元 B 輪投資。
拓展舊有向量數(shù)據(jù)庫: Milvus 則計劃引入 OpenDAL(Rust 開發(fā)的存儲訪問層)的 C++ binding,以支持跨多云數(shù)據(jù)存儲能力。
拓展現(xiàn)有其他數(shù)據(jù)庫: Databend 支持向量類型的存取與基本相似度查詢功能,并且提供 AI Functions ,能夠與 OpenAI API 進行交互。
拓展舊有其他數(shù)據(jù)庫: AI 初創(chuàng)公司 tensorchord 使用 Rust 開發(fā) PostgreSQL 的向量處理拓展 pgvecto.rs 。
Rust 的機遇與挑戰(zhàn)
回顧 Databend Labs 使用 Rust 的研發(fā)歷程,并且結(jié)合業(yè)界其他公司的經(jīng)驗,我們認為,Rust 能夠成為構(gòu)建新時代基礎設施的首選語言的主要因素有以下幾點:
內(nèi)存安全
性能保障
敏捷開發(fā)
機遇
Rust 在新時代中的機遇,其實可以和前面 Rust 如何進入向量數(shù)據(jù)庫結(jié)合起來看,這里同樣舉幾個典型的項目作為例子。
新項目服務舊場景:
Polars 是 Pandas 的有力競爭者,團隊宣布種子輪收獲 400 萬美元融資,用于打造 OLAP 計算平臺。
HuggingFace 開源新的深度學習框架 Candle ,使用 Rust 編寫。
新項目服務新場景
llmchain-rs 針對大模型工具鏈提供一站式解決方案。
mosec 針對大模型部署和服務開發(fā)提供高性能解決方案。
挑戰(zhàn)
程序的可靠性仍然需要開發(fā)者自己去管理,并不能因為使用 Rust 就掉以輕心。一個有意思的段子是 “聲稱內(nèi)存安全的項目中,往往充斥著大量的 unsafe 代碼”。
盡管生態(tài)已經(jīng)日趨完善,但在實際開發(fā)過程中,仍然少不了造輪子。而對于非系統(tǒng)編程,或者原型快速開發(fā)階段,使用 Rust 在開發(fā)工具和生態(tài)對接上相比 Java 、Python 等語言還存在一些問題。
由于 Rust 本身的復雜性,新手仍然需要邁過門檻,而且 Rust 語言進入到項目以后在編譯時間、CI 流水線等方面都需要進行不同程度的調(diào)試與改造。