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