目前阿里集團天天有近1000PB的數據是經過LogAgent採集的,爲了讓LogAgent作到資源佔用節省和高效採集,背後是基於HiSDP去構建的。git
原因
當決定採用C++編程語言去開發一個軟件時,緊接着所面臨的問題是軟件庫、平臺與框架的選擇。固然,選擇的範圍估計很大程度來自開源軟件。進一步地,無外乎兩種思路:程序員
根據所開發軟件的須要選擇各類合適的開源軟件,而後將這些開源軟件組合到一塊兒去完成軟件開發工做。這種方式所帶來的問題在於,將各個開源軟件拼湊到一塊兒須要耗費必定的精力。此外,可能由於踩各開源軟件中的坑而致使最終軟件產品的穩按期拉得更長,後期的維護成本也更高。
採用市面上成熟的大型開源軟件項目,對之進行裁剪去知足項目開發的須要。這一方式雖然說在裁剪上須要消耗必定的精力(這是一次性的工做內容),但因爲大型項目的成熟確保了其所選擇的各個開源子項目的質量獲得了充分的驗證而避免咱們再踩坑,且其中所使用各開源軟件的代碼能很好地起到示範做用去幫助工程師更快地上手寫出更具質量的代碼。HiSDP就是基於這一思路而產生的!
HiSDP源於Google的Chromium開源軟件,即你們平時常用的Chrome瀏覽器的開源版。做者由於曾經有大約3年半的時間是基於Chromium作淘寶瀏覽器和UC瀏覽器電腦版的軟件開發工做,因此對Chromium背後所蘊藏的Google之工程理念和對工程質量的要求有着深入的認識與體感,算法
包含但不限於:chrome
重度依賴單元測試。Chromium對單元測試代碼的組織與實踐造成了一套行之有效、很容易上手的工程規範,很好地示範瞭如何經過gtest/gmock去編寫單元測試代碼,並讓執行單元測試的動做與開發環境作到了無縫整合。
特別重視程序的性能度量。Google一直力爭讓Chrome瀏覽器在運行速度上與競品保持優點,爲此很是重視性能數據的可視化,tracing功能就是在這樣的背景下產生的(用Chrome瀏覽器導航到chrome://tracing這個網址就能夠對瀏覽器打開的網頁進行性能tracing)。
極度關注程序的編譯效率。因爲Chromium的代碼量非常龐大,因此這個項目從開始之初就在一直持續地優化整個工程的編譯速度。除了gn+ninja這一編譯工具組合,Chromium的代碼組織與程序格式也爲了加速編譯而作了規範並細緻地執行到位。
將程序的可查錯性看成良好的編程習慣。整個Chromium的代碼隨處可見DCHECK(與assert類似),以及在關鍵點存在CHECK(會產生dump文件而記錄下發生問題的現場)。
嚴格執行Google C++ Coding Style中所定義的編碼規範。爲了幫助新手更好地掌握這一規範,甚至還開發出了cpplint這樣的代碼規範掃描工具(用Python實現的)。
對軟件設計質量的持續極致追求。Chrome瀏覽器大約6周出一個大版本,每一個版本都能看到對以前沒有作到位的完善痕跡,有的改進尺度之大足以讓人爲之動容。這種工程實踐所帶來的結果是Chromium的總體代碼質量很高且久經考驗。
基於我對Chromium的這些認識,很天然地想到將那些能力與氣質帶到其餘項目中,但願能「站在巨人的肩膀上」以「殺雞用牛刀」的思路去開發其餘C++軟件。編程
HiSDP是High-productivity Software Development Platform的簡寫。取這個名的本意是但願他成爲C++編程語言的高效軟件開發平臺。然而,將Chromium裁剪成HiSDP並使之適合用於集團服務器環境下的軟件開發仍是經歷了一些波折。最大的問題在於,Chromium的開發環境基本上是基於Ubuntu 16.04構建的,存在內核版本比集團環境的更高而致使沒法直接正常運行的問題,固然這個問題通過一番折騰後獲得瞭解決。vim
能力
具有跨Windows、Mac和Linux操做系統的軟件開發能力。HiSDP徹底保留了Chomium的base庫,該庫抽象並封裝了file、string、threading、process、message_loop、memory、profiling等諸多內容,能很好地知足其餘軟件開發工做的基礎須要。
具有複雜工程的高效源代碼組織與快速構建能力。經過gn文件(與CMakeLists.txt文件的做用類似)對源文件進行管理;經過ninja(與make相似)調用編譯器完成編譯工做;經過DEPS文件管理工程所依賴的第三方Git倉庫。能夠想象,gn文件的語法徹底考慮了跨平臺場景下源代碼的組織形式。構建速度將隨着項目規模的增大而表現得越發明顯。
全面複用與Chromium配套的各類開發工具。Chromium將各類工具都放到了depot_tools 這個獨立的Git倉庫中,其中包含了支撐高效軟件開發工做的各類腳手架工具。
實現了被開發軟件與HiSDP自身的很好解耦。經過引入HiApp的概念,將基於HiSDP開發的軟件的源代碼都放在一個獨立的Git倉庫中,將HiApp與這個倉庫掛鉤而實現了與HiSDP的代碼組合。下面的命令示例瞭如何獲取depot_tools、HiSDP和LogAgent的代碼,但願有助於幫助理解HiApp的概念。瀏覽器
$ git clone http://gitlab.alibaba-inc.com/middleware-expert/depot_tools.git depot_tools $ vim ~/.barshrc // 追加下面內容 export PATH="/path/to/depot_tools/:$PATH" $ source ~/.barshrc $ mkdir LogAgent && cd LogAgent $ fetch hisdp --hiapp=git@gitlab.alibaba-inc.com:LogAgent/Agent.git@release-3.0
簡單說來,使用depot_tools和HiSDP的開發體驗與Chromium是徹底同樣的。服務器
價值
解決「技術能夠,開發不行」現象。當個體對軟件工程沒有足夠的認識,並不清楚除了編程語言和算法外,還有其餘關鍵因素影響着開發效率和最終的軟件質量,那時就會表現出「技術能夠,開發不行」,即各類技術知識都知道,但卻作不到有質效地開展軟件開發工做。HiSDP由於繼承了Chromium十多年所沉澱的工程經驗,因此是一個很好的學習場所,即使一開始沒有意識到那麼作背後所蘊含的理念,只要模仿就可能最終貫通領悟。
助力跨平臺軟件開發。因爲自然地支持開發可運行於Windows、Mac和Linux上的軟件,HiApp由於有這樣的「底座」而更容易實現跨平臺開發。
提升軟件開發效率。這一點是顯而易見的,圍繞工程各個方面的腳手架工做在HiSDP上都已具有,只需在HiApp的開發中專一於所需解決的業務問題。
經過代碼共享解決了版本依賴問題。與大多C++程序員所但願的所不一樣的是,HiSDP不是以庫的形式呈現的,而是徹底以源碼形式。藉助HiApp這一律念,使得被開發軟件的源代碼也成爲了HiSDP的一部分。這一形式省去了採用庫形式發佈所帶來的版本升級與同步問題,當HiSDP中修復了缺陷時,由HiApp的開發者經過pull最新的代碼作到修復。若是讀者細想這一點,會對其價值有更深的認識。
挑戰
正如「天下沒有免費的午飯」所表達的哲理,當咱們在享受HiSDP所帶來的優點時,也不得不面臨一些挑戰,即掌握HiSDP須要必定的時間、其入門的門坎相對要高出很多。誠然,這一挑戰須要工程師個體經過學習去應對,且學習過程須要在即使上手後仍持續保持,由於HiSDP真的是一個巨大的知識寶藏,從技術和工程領域都給出了不少有啓發性的實現參考和解決方案,很是值得「細品慢嚼」。app
最後,LogAgent在剛過去的2018財年很好地用HiSDP演繹了「用牛刀殺雞」的工程理念。框架