昨天GitHub官方發(fā)布消息,宣布其使用Rust語言重寫的代碼搜索引擎黑鳥系統(tǒng)Blackbird正式啟用。關(guān)于黑鳥系統(tǒng)的歷史和技術(shù),今天蟲蟲就給大家普及一下。
概述
黑鳥系統(tǒng)的目標(biāo)是實(shí)現(xiàn)開發(fā)人員快速搜索、導(dǎo)航和理解其代碼,將關(guān)鍵信息置于上下文中,并最終提高他們的工作效率。 為實(shí)現(xiàn)這一目標(biāo),需要實(shí)現(xiàn)以下功能:
首先,一個(gè)完全重新設(shè)計(jì)的搜索界面,帶有建議、補(bǔ)全以及對(duì)結(jié)果進(jìn)行切片和切塊的能力。
其次,需要完全從頭開始構(gòu)建了一個(gè)新的代碼搜索引擎。新的引擎需要非??欤ù蠹s是舊代碼搜索速度的兩倍),功能更強(qiáng)大(支持子字符串查詢、正則表達(dá)式和符號(hào)搜索),并且理解代碼,將最相關(guān)的結(jié)果放在排名最前面。
最后,要完全重新設(shè)計(jì)GitHub的代碼視圖,將搜索、瀏覽和代碼導(dǎo)航緊密集成。
Github代碼搜索歷史和問題
GitHub成立于2008年,最初使用Apache Solr來處理其代碼搜索。
在Solr被并入Lucene之后。 2013年Github團(tuán)隊(duì)使用Elasticsearch對(duì)其搜索進(jìn)行了改造,基于Elasticsearch創(chuàng)建了一個(gè)新的搜索服務(wù)。
隨后,基于Elasticsearch搜索服務(wù)屢次出現(xiàn)服務(wù)終端故障。
在探索了基于通用文本搜索產(chǎn)品來支持代碼搜索,GitHub發(fā)現(xiàn)基于現(xiàn)有產(chǎn)品搭建的系統(tǒng)用戶體驗(yàn)差,索引速度慢,托管成本高。
2020年GitHub內(nèi)部開始了一個(gè)新項(xiàng)目黑鳥系統(tǒng),用來解決搜索服務(wù)不穩(wěn)定的問題。
黑鳥架構(gòu)
黑鳥系統(tǒng)架構(gòu)圖如下:
黑鳥系統(tǒng)是基于Rust語言,從零開始構(gòu)建搜索引擎,專門用于代碼搜索領(lǐng)域。
黑鳥系統(tǒng)所要實(shí)現(xiàn)的用戶體驗(yàn)愿景:
能夠提出代碼問題并通過迭代搜索、瀏覽、導(dǎo)航和閱讀代碼獲得答案。
GitHub團(tuán)隊(duì)通過實(shí)踐意識(shí)到其代碼搜索與一般文本搜索有根本的區(qū)別。
首先、代碼已經(jīng)被設(shè)計(jì)成可以被機(jī)器理解,所以其內(nèi)部在結(jié)構(gòu)上、功能上和功能上下文上必然存在聯(lián)系性。
同時(shí)搜索代碼也有獨(dú)特的要求,需要搜索標(biāo)點(diǎn)符號(hào)(例如,句號(hào)或左括號(hào));不能從查詢中刪除停用詞;另外,代碼搜索還需要支持正則表達(dá)式。
最后,GitHub的巨大倉庫規(guī)模是一個(gè)很大的挑戰(zhàn)。其基于Elasticsearch的搜索系統(tǒng),需要花費(fèi)數(shù)月的時(shí)間來索引當(dāng)時(shí)800萬倉庫的代碼。
目前GitHub倉庫數(shù)已經(jīng)超過了2億,而且還在持續(xù)增長(zhǎng)中,這對(duì)搜索引擎來說是個(gè)巨大的挑戰(zhàn)。
目前GitHub可搜索庫有4500萬公開庫,代碼總量為115TB,還有155億的相關(guān)文檔。
千萬級(jí)代碼的索引
黑鳥系統(tǒng)所要解決的第一個(gè)問題是如何在合理的時(shí)間內(nèi)構(gòu)建對(duì)這4500萬代碼庫的代碼和文檔進(jìn)行索引。由Git的天然特性,其內(nèi)容可通過哈希尋址并且GitHub 上實(shí)際上有很多重復(fù)內(nèi)容,所以可行的策略是:
按Git blob對(duì)象ID進(jìn)行分片,git對(duì)象天然這提供了一種在分片之間均勻分布文檔同時(shí)避免任何重復(fù)的好方法。由于特殊的存儲(chǔ)庫,不會(huì)有任何熱服務(wù)器,可以根據(jù)需要輕松擴(kuò)展分片的數(shù)量。
將索引建模為樹并使用增量編碼來減少爬行量并優(yōu)化索引中的元數(shù)據(jù)。元數(shù)據(jù)就像文檔出現(xiàn)的位置列表(路徑、分支和存儲(chǔ)庫)和有關(guān)這些對(duì)象的信息(存儲(chǔ)庫名稱、所有者、可見性等)。 對(duì)于流行內(nèi)容,此數(shù)據(jù)可能非常大。
黑鳥還專門進(jìn)行了設(shè)計(jì)將查詢結(jié)果在提交級(jí)別的基礎(chǔ)上保持一致。
當(dāng)用戶從存儲(chǔ)庫范圍的查詢中獲取結(jié)果時(shí),其他人可能正在對(duì)全局結(jié)果進(jìn)行分頁并查看不同于先前但仍然一致的索引狀態(tài)。使用其他搜索引擎很難做到這一點(diǎn)。黑鳥提供這種級(jí)別的查詢一致性作為其設(shè)計(jì)的核心部分。
查詢的生命周期
在實(shí)現(xiàn)了對(duì)代碼的索引后,系統(tǒng)跟蹤查詢就比較容易實(shí)現(xiàn)了。比如黑鳥系統(tǒng)查詢是符Rail組織用于查找Ruby編程語言編寫的代碼的正則表達(dá)式,格式為:
/arguments?/org:railslang:Ruby
查詢路徑的高級(jí)架構(gòu)圖:
在網(wǎng)站和分片之間是黑鳥查詢服務(wù)(BQS),它協(xié)調(diào)接受用戶查詢并將請(qǐng)求分散到搜索集群中的每個(gè)主機(jī)。黑鳥系統(tǒng)使用Redis來管理配額和緩存一些訪問控制數(shù)據(jù)。
前端接受用戶查詢并將其傳遞給BQS,查詢服務(wù)將查詢解析為抽象語法樹,然后重寫它,將諸如語言之類的東西解析為其規(guī)范的Linguist 語言ID,并在額外的條款上標(biāo)記權(quán)限和范圍。這樣,就可以看到重寫如何確保將從公共存儲(chǔ)庫或有權(quán)訪問的任何私有存儲(chǔ)庫中獲得結(jié)果。
接著查詢分成n個(gè)請(qǐng)求,并行請(qǐng)求到后端分片服務(wù):
BQS得到分片的結(jié)果后,聚合所有分片的結(jié)果,按分?jǐn)?shù)重新排序,過濾(雙重檢查權(quán)限),并返回前100列表。搜索前端仍然需要做語法高亮,term高亮、分頁,然后將渲染到頁面呈現(xiàn)給用戶。
來自各個(gè)分片的p99響應(yīng)時(shí)間大約為100ms,但由于聚合響應(yīng)、檢查權(quán)限和語法突出顯示等原因,總響應(yīng)時(shí)間會(huì)稍長(zhǎng)一些。一個(gè)查詢占用索引服務(wù)器上的單CPU內(nèi)核100ms,GitHub 現(xiàn)有一臺(tái)64核主機(jī)大約每秒可以執(zhí)行640個(gè)查詢。性能非常強(qiáng)硬,而且由于天然地分布式分片,所以可以很方便實(shí)現(xiàn)水平擴(kuò)展,為同時(shí)用戶查詢和未來增長(zhǎng)提供了充足的空間(多加分片服務(wù)器即可)。
總結(jié)
黑鳥代碼搜索系統(tǒng)是一個(gè)全新的基于Rust的高性能分布式代碼搜索系統(tǒng)。GitHub團(tuán)隊(duì)基于現(xiàn)有業(yè)務(wù)和問題的解決基礎(chǔ)積極探索重新開發(fā)出適合自己獨(dú)特業(yè)務(wù)、規(guī)模和需求的系統(tǒng)值得每一個(gè)軟件系統(tǒng)架構(gòu)師學(xué)習(xí)和借鑒。
當(dāng)然對(duì)于廣大的碼農(nóng)來說,以后在GitHub站搜代碼更方便和快捷,GitHub也對(duì)其新系統(tǒng)提供了豐富的文檔(docs.github /en/search-github)希望大家趕緊探索嘗試,找出一些好用的技巧來給大家分享。
審核編輯 :李倩
-
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521 -
GitHub
+關(guān)注
關(guān)注
3文章
468瀏覽量
16427 -
Rust
+關(guān)注
關(guān)注
1文章
228瀏覽量
6601
原文標(biāo)題:從Solr到Elasticsearch再到Blackbird,GitHub用Rust重寫代碼搜索引擎
文章出處:【微信號(hào):Rust語言中文社區(qū),微信公眾號(hào):Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論