揭祕騰訊工蜂:企業級代碼管理協做解決方案

互聯網敏捷研發,離不開高效的代碼管理系統。做爲研發流程的基礎環節,代碼管理具有串聯需求管理、持續集成、持續交付等上下游研發鏈路的做用,也承載着企業追求代碼質量、鼓勵代碼複用等工程師文化的建設。騰訊擁有近3萬研發人員,產品線漫長、業務種類繁多,不一樣的團隊規模、技術棧和研發模式都對研發協做提出了不一樣的需求,也致使了代碼庫規模和研發流程良莠不齊。同時編譯系統、發佈系統等須要檢出全部代碼,自動化程度越高,對代碼庫的訪問壓力就越大。提供安全穩定的代碼服務,管理不一樣規模的代碼倉庫,支持各類類型的研發流程,是代碼管理面臨的三大挑戰。基於行業情況及自身發展須要,騰訊選擇了以Git爲基礎,在內部孵化了自研的Git系統——工蜂。數據庫

首先要解決服務端代碼庫存儲擴容問題,由於單存儲節點沒法知足TB級增加的存儲量,可考慮的有自定義數據分片和通用分佈式文件存儲兩種方案。分佈式存儲的優勢是對應用層屏蔽了底層存儲結構,架構相對簡單,但對IO密集型的代碼託管應用來講,過於依賴分佈式文件系統的IO性能,可移植性也不強。相反自定義數據分片能夠自由控制分片策略,靈活均衡資源負載,另外在每一個分片的底層存儲上,也能夠結合分佈式存儲,進一步擴展數據備份。工蜂選擇了數據分片的方案,以倉庫路徑做爲路由規則,並在應用層實現跨分片操做。數十萬倉庫分佈在不一樣集羣,能夠實現集羣動態擴容和集羣間無縫遷移。後端

解決了存儲擴容問題後,訪問量增長逐步暴露了單機的性能瓶頸,代碼庫的讀取和寫入都集中在一臺主機上,會致使計算和內存資源吃緊。經過分析來源,大量的讀請求來自編譯和發佈系統,針對這種讀多寫少的場景,工蜂實現了代碼庫級一主多從的讀寫分離模式,寫請求分發給主機,讀請求會根據當前負載狀況均衡分流給從機。主從間的數據同步採用Git原生操做,最大程度保證操做的原子性和數據一致性。同時從機做爲實時熱備數據,配合異地冷備,創建了完整的代碼庫數據容災體系,以保證數據安全性。圖1是完整的代碼庫後端存儲架構。安全

圖1 數據分片和讀寫分離

如何管理超大庫一直是代碼管理工具的難題,Git的設計初衷是管理文本類的代碼文件,但工程中免不了會有依賴庫和資源文件等,特別是騰訊的遊戲類業務,包含大量的圖片、音視頻文件,使得這個問題在騰訊更爲凸顯。工蜂引入了開源的擴展方案Git LFS,專門託管大型二進制文件。如圖2所示,經過把這些文件存儲在Git倉庫以外,在Git倉庫中只保留文件的文本指針,這種方式能夠極大減少Git倉庫自己的體積,加快克隆倉庫的速度。目前工蜂託管的單個大型遊戲倉庫超過2.5T,單庫上限問題得以解決。微信

圖2 大文件存儲

總體架構上,工蜂採用了業界流行的微服務架構。圖3中,協議代理服務爲HTTP、SSH、LFS三類協議提供獨立的訪問鏈路,數據服務封裝了數據庫訪問,路由服務爲每一個請求尋址後端代碼庫的數據節點,業務服務根據平臺提供的功能拆分,例如代碼瀏覽、代碼統計、代碼評審、代碼搜索等都是獨立的微服務。此外,統一的註冊中心和配置中心提供服務發現、服務路由、異常熔斷和服務配置等全局功能。全部微服務都設計爲無狀態模式,能夠方便的水平擴展。藉助容器化部署的能力,能隨時調整實例數量以應對高併發場景。restful

圖3 微服務架構

代碼工具若是不與上下游研發流程打通,對提高研發效能的做用就很是有限。工蜂的優點之一在於豐富的開放能力,支持第三方系統集成接入。Webhook推送機制,便於第三方訂閱代碼庫提交事件,普遍用於提交代碼後自動觸發持續集成系統編譯構建。Commit Check攔截機制,用於代碼合入前自動流水線發起代碼規範、缺陷檢測、單元測試等代碼檢查,經過設置質量紅線,嚴控合入代碼的質量。工蜂還提供了豐富的符合restful標準的API,完善了私人令牌和OAuth受權機制,給第三方提供了安全有效的標準化接入方式,擴展了工蜂的應用場景。markdown

在騰訊內部,工蜂已在六大事業羣全面普及,服務了包括微信、QQ在內的數千條業務線,代碼庫數量近二十萬,日訪問量達千萬級別,API日均調用數百萬次,有效提高了公司的總體研發效能。在公司內部開源協同的戰略目標下,工蜂也在潛移默化的改變公司的協做方式,目前工蜂的項目中已有半數以上實現了對內徹底開源,用Issue討論也正成爲跨團隊協做的有效溝通方式。架構

今年9月底,「騰訊工蜂——基於Git的研發工程平臺」項目在中國計算機學會的評選中脫穎而出,榮獲2019年「CCF科學技術獎」。據悉,「CCF科學技術獎」授予對象爲在計算機科學、技術或工程領域具備重要發現、發明、原始創新,在相關領域有必定國際影響的優秀成果。本次獲獎是對工蜂的極大確定,將來工蜂將致力於代碼複用程度、研發一體化體驗、研發過程數據度量等多方面探索,在代碼管理領域持續深耕,爲公司及行業提供更大的價值。併發

相關文章
相關標籤/搜索