Facebook開源軟體列表
從Facebook的GitHub賬戶中可以看到,Facebook已經開源的開源專案有近300個,領域涉及移動、前端、Web、後端、大資料、資料庫、工具和硬體等。Facebook開源專案負責人James Pearce曾在OSCON解釋過Facebook究竟為何要使用、支援和釋出開源專案。具體如下:
- 共享Facebook的程式碼(通常是軟體“棧”,偶爾也包括硬體設計)促進了這個世界的創新。這些程式碼幫助他人更快地開發軟體。因為Facebook不是一家軟體公司,所以它在開源過程中沒有面臨競爭對手的威脅,相反,開源帶來的價值在逐漸顯現。使用者使用Facebook的開原始碼可以更快地構建應用,而他們也樂於回饋程式碼,使Facebook從中受益。
- 擁抱開源,意味著Facebook必須一開始就寫出更優秀的軟體。如果他們知道某個軟體從誕生起就要公開,那就必須要好好做,提高可用性和可靠性,因為將來外面的人都會用它。這種壓力也會給公司內部帶來更多的價值。
- 開源帶來了共享挑戰的機會。開源專案面臨的難題會吸引一些外部的優秀人員,而結果是,他們也帶動了公司內部人員的能力提升。每天Facebook都承載了超過一億人的溝通互聯,何以能做到?唯有開源的力量。
下面是我整理的Facebook現有的比較活躍的開源專案列表,歡迎交流討論。
移動開發框架:React Native
React Native是Facebook在2015年開源的基於React.js的移動開發框架,它的設計理念是讓移動應用既擁有Native的使用者體驗,同時又可以保留React的開發效率,提高程式碼的複用率。React Native的宗旨是,學習一次,高效編寫跨平臺原生應用。開發者可以使用JavaScript編寫應用,並利用相同的核心程式碼就可以建立Web、iOS 和Android平臺的原生應用,目前已經實現了對iOS和Android兩大平臺的支援。
資料查詢語言:GraphQL
GraphQL是Facebook開源的資料查詢語言。Facebook在構建移動應用程式時,需要用API獲取足夠強大的資料來描述所有的臉譜,同時簡單易學易用,於是開發了GraphQL,並支援每天千億級的呼叫。GraphQL不是像MySQL或Redis這樣直接面向資料的介面,而是面向已經存在的應用程式碼的介面。你可以把GraphQL看作是為了呼叫應用伺服器上的方法的一些內嵌的RPC。
大資料查詢引擎:Presto
Presto是Facebook開發的一款分散式SQL引擎,主要用於針對各種大小的資料來源(從GB到PB)來執行互動式分析查詢。Facebook建立Presto的主要目的在於幫助他們更快地分析資料,因為Facebook的資料量一直在持續增長,產品週期的節奏也變得越來越快。自從2013年11月開源後,Presto的使用者量呈現了爆發式增長。諸如Airbnb、京東、Dropbox以及Netflix等公司都將Presto作為自己的互動式查詢引擎。
PHP執行引擎:HHVM
HHVM(HipHop Virtual Machine)是Facebook於2013年開源的PHP執行引擎。它採用一種JIT(just-in-time)的編譯機制實現了高效能,同時又保持對 PHP 語法的充分支援。HHVM常常用作獨立的伺服器,用於替代Apache與mod_php,旨在執行使用Hack與PHP所編寫的程式。它使用了即時編譯方法來實現超高的效能,同時又保持了PHP開發者所習慣的靈活性。
JavaScript庫:React
React是Facebook開發的用於構建使用者介面的JavaScript庫,現已為很多公司所用,因為它採用了一種不同的方式來構建應用:藉助於React,開發者可以將應用分解為彼此解耦的獨立元件,這樣就可以獨立維護並迭代各種元件了。2015年,React有兩個主要的釋出,同時還發布了React Native,並且釋出了新的開發者工具。現在已經有越來越多的公司(包括Netflix與WordPress)開始使用React構建自己的產品了。
鍵值儲存系統:RocksDB
RocksDB是Facebook開源的嵌入式、可持久化鍵值儲存系統,它基於Google的LevelDB,但提高了擴充套件性可以執行在多核處理器上,可以有效使用快速儲存,支援IO繫結、記憶體和一次寫負荷。過去一段時間,RocksDB在社群非常流行,Facebook分析其原因在於它能夠對由於網路延遲等原因造成的慢查詢響應時間起到消除的作用,RocksDB非常靈活,完全可以針對各種新興的硬體發展趨勢進行定製。LinkedIn與Yahoo都是RocksDB的重度使用者。
人工智慧硬體平臺:Big Sur
近些年,人工智慧和機器學習方向取得了長足的發展。據Kevin Lee透露,Facebook的AI軟體已經能夠閱讀故事、回答相關場景的問題、玩遊戲以及通過一些例子來學習非指定的內容。作為計算密集型的應用,AI軟體的效能與資料集規模/硬體效能密切相關。尤其是硬體方面,高效能微處理器、儲存器以及圖形處理器(Graphics Processing Unit,GPU)的發展為AI演算法的快速執行提供了堅實基礎。為了進一步更好地服務大規模AI計算,Facebook推出了基於GPU的、用於訓練神經網路的“Big Sur”硬體系統。
網路模擬測試工具:ATC
Augmented Traffic Control(ATC)能夠利用Wi-Fi網路模擬2G、2.5G(Edge)、3G以及LTE 4G行動網路環境,測試工程師們可以快速在各種不同的模擬網路環境中切換,從而實現對智慧手機和App在不同國家地區和應用環境下的效能表現進行測試。ATC是Facebook內部團隊在2013年的一次Hackathon活動上開發出來的工具,其原理實際是利用了Linux流量控制系統,通過純Python的網路庫pyroute2呼叫netlink的API控制,而開發其的目的是為了確保更多的使用者獲得最好的應用體驗。
開源資料庫:HydraBase
HydraBase是HBase資料庫的升級版。Facebook是HBase的重度使用者,Facebook的HBase資料庫系統儲存著Facebook的很多關鍵業務資料,包括內部監控系統、搜尋索 引、流資料分析以及資料抓取等。HydraBase相比HBase穩定性和可用性更高,可以減少伺服器宕機時間。HydraBase能夠讓一個數據域分佈在多個域伺服器中,域伺服器之間能相互備份,因此能夠大大減少資料恢復所用的時間。Facebook聲稱HydraBase能將Facebook全年的宕機時間縮減到不到5分鐘。
Facebook已經將HydraBase捐贈給Apache,目前很多程式碼都已經被合併到HBase中。
關係型資料庫:WebScaleSQL
WebScaleSQL是基於MySQL 5.6 社群版本改編的MySQL通用分支,基於GPL開源協議釋出。WebScaleSQL目前已經做了很多效能改進工作,包括:客戶端非同步協調、邏輯預讀、查詢限流、服務端執行緒池優化、InnoDB大頁支援等等。WebScaleSQL上的功能都是很“Web Scale”和接地氣的。比如執行緒池優化,WebScaleSQL基於Mariadb的執行緒池實現進行重寫並優化,對讀寫佇列進行分離,重新設計佇列優先順序策略,避免了餓死現象。要知道執行緒餓死在有些場景下是很嚴重的。尤其是在併發連線數往往很大的網際網路應用裡面。
程式碼審查工具Phabricator
程式碼審查方面,Facebook開源了視覺化工具Phabricator。工程師可以在頁面上非常方便的針對每一段(單行或者多行)程式碼進行互動討論;負責審查的工程師可以接受程式碼改變,可以提出疑問要求原作者繼續修改,可以提出自己不適合以推出該程式碼審查,等等。只有程式碼被明確接受之後才能被工程師提交到伺服器端的程式碼庫,這一點整合到提交工具中強制執行。
C語言事件框架:libPhenom
libPhenom是Facebook釋出的一個C語言事件框架,用於構建高效能和高可擴充套件的系統。支援多執行緒、提供記憶體管理和常用資料結構、JSON處理。特性如下:
- 帶有計數器的記憶體管理——記錄應用程式正使用的記憶體型別的次數
- 工作——分解你的應用程式並用排程管理來搞定它們
- 帶緩衝的I/O流
- 常用的資料結構(雜湊表、列表、佇列)
- 資料型別的變種來使能JSON的序列化和反序列化
- 帶有註冊物件格式的printf的實現
Star數量:1334
C++HTTP框架:Proxygen
Proxygen是一款Facebook開源的支援SPDY 3.1的HTTP框架。其目的不是替換Apache,而是有能力建立一個專用的高效能Web伺服器,使其可以嵌入到Facebook提供Web服務的現有應用中。Facebook從2011年開始構建一款代理伺服器(Proxygen這個名字也是由此而來),在該專案演進並在生產環境中測試了數年之後,Facebook將其程式碼開源了。 Facebook內部做的基準測試表明,在一個Proxygen echo伺服器上,每秒可以支撐多達304 197次基於SPDY 3.1的記憶體GET請求。
開源動畫庫:Pop
Pop是Facebook推出的一個可擴充套件的iOS 和OS X動畫庫,其新聞聚合閱讀應用Paper背後的核心技術就是由Pop支援。除了增加基本的靜態動畫外,還支援Spring和衰變動態動畫,可非常方便的構建現實的、基於物理的互動。Pop動畫庫的動畫效果非常流暢,因為它使用了CADisplayLink來重新整理畫面(幀),一秒鐘重新整理幀數為60幀,接近於遊戲開發引擎。Pop動畫的自成體系,與系統的CoreAnimation有很大的區別,但使用上非常相似。
Memcached協議路由器:Mcrouter
Mcrouter 是一個基於Memcached 協議的路由器,它是 Facebook快取架構的核心元件,在峰值的時候,它能夠處理每秒50億次的請求。Memcached服務的客戶端都會使用標準ASCII編碼的Memcached協議,所以對於客戶端來說,Mcrouter就像一個Memcached伺服器;而對於伺服器端來說,Memcached卻又像一個普通的Memcached客戶端。Mcrouter主要使用C++開發,且使用C開發了功能庫部分,使用Ragel開發了協議解析部分,使用開源庫Folly和Fbthrift處理非同步網路。
靜態程式碼分析工具:Infer
Infer是Facebook的開發團隊在程式碼提交內部評審時,用來執行增量分析的一款靜態分析工具,在程式碼提交到程式碼庫或者部署到使用者的裝置之前找出bug。由OCaml語言編寫的Infer目前能檢測出空指標訪問、資源洩露以及記憶體洩露,可對C、Java或Objective-C程式碼進行檢測。Facebook使用Infer自動驗證iOS和安卓上的移動應用的程式碼,bug報告的正確率達80%。Infer通過捕獲編譯命令,把要被編譯的檔案轉換為可用於分析潛在錯誤的中間語言格式。整個過程是增量進行的,意味著通常只有那些有修改過並提交編譯的檔案才會被Infer分析。Infer還集成了大量的構建或編譯工具,包括Gradle、Maven、Buck、Xcodebuild、clang、make和javac。
作業系統監控工具:osquery
osquery是一款面向OSX和Linux的作業系統檢測框架。它將作業系統暴露為一個高效能的關係型資料庫,允許使用者編寫SQL查詢檢視作業系統資料。在osquery中,SQL表代表像下面這樣的抽象概念:
- 正在執行的程序
- 已載入的核心模組
- 開啟的網路連線
雖然osquery利用了非常底層的作業系統API,但它允許使用者在Ubuntu、CentOS和Mac OS X上構建並使用它。osquery效能極高,記憶體佔用小,支援使用者在整個基礎設施上執行查詢。
GitHub主頁:https://github.com/facebook/osquery
Star數量:6209
JavaScript靜態型別檢查工具:Flow
Flow是Facebook出品的一個JavaScript程式碼的靜態型別檢查工具,該工具採用開放原始碼的OCaml(Objective Caml)語言開發,。Flow能夠幫助開發人員查找出JavaScript程式碼中的型別錯誤,從而提高開發效率和程式碼質量。Flow已經能夠捕獲JavaScript程式碼中的常見問題,如靜態型別轉換不匹配、空指標引用等問題。同時,Flow還為JavaScript新增了型別語法,如類型別名。
Haskell庫:Haxl
Facebook開源了Haxl,一個為高效併發資料訪問而開發的庫。這個庫
一方面利用了Haskell的傳統優勢,比如表達力很強的型別系統、對正確性和安全性的保障,另一方面也受益於GHC(Haskell編譯器)的高效能執行時庫,解決煩人的隱式併發資料訪問的問題。Haxl簡化了對遠端資料的訪問,比如資料庫或網站服務。對同一資料來源的多個訪問請求,或同時從不同的資料來源請求資料,它都能批量處理,並且快取上一次的結果。
Web應用架構:Flux
Facebook認為MVC無法滿足他們的擴充套件需求,因此他們決定使用另一種模式:Flux。由於Facebook非常巨大的程式碼庫和龐大的組織,所以MVC真的很快就變得非常複雜,於是他們得出結論,認為MVC不適合於大規模應用。
每次Facebook工程師努力增加一項新特性時,系統的複雜性成級數增長,程式碼變得“脆弱和不可預測”。對於剛接觸某個程式碼庫的開發人員來說,這正成為一個嚴重的問題。Flux是一個Facebook開發的、利用單向資料流實現的應用架構,用於 React。Flux應用有三個主要的部分組成:排程程式、儲存和檢視(React 元件)。
JavaScript單元測試工具:Jest
Jest是一個開源的、基於Jasmine框架的JavaScript單元測試工具。Jest源於Facebook兩年前的構想,用於快速、可靠地測試Web聊天應用。它吸引了公司內部的興趣,Facebook的一名軟體工程師Jeff Morrison半年前又重拾這個專案,改善它的效能,並將其開源。
在最基礎層面,Jest被設計用於快速、簡單地編寫地道的JavaScript測試。Jest自動模擬require()返回的CommonJS模組,並提供了包括內建的測試環境Dom API支援、合理的預設值、預處理程式碼和預設執行並行測試在內的特性。通過在並行程序中同時執行測試,Jest讓測試更快地結束。
基於Atom的開發工具集:Nuclide
Nuclide是Facebook 推出的一套基於Atom的開發工具集,用於開發基於Hack的Web應用,提供自動完成和JavaScript型別檢查,內建React開發支援,並支援Facebook最新的React Native庫,支援Facebook的Flow JavaScript型別檢查器。Nuclide的設計目是為了在整個公司為工程師提供一套標準的開發者經驗——無論他們從事純iOS應用,React和React Native程式碼,或者在Hack執行我們的HHVM網路服務。
Android除錯工具:Stetho
Stetho是一個Android應用的除錯工具。當Android應用整合Stetho時,開發者可以通過訪問Chrome,在Chrome Developer Tools中檢視應用佈局、網路請求、sqlite、preference等等,視覺化一切應用操作(更重要的是不用root)。開發者也可通過它的dumpapp工具提供的命令列介面來訪問應用內部。
Android編譯工具:Buck
Buck受到了Google Blaze的啟發,建立它是為了處理與多個Android庫有複雜關聯的應用程式,從而減少構建時間。引入Buck之後,Facebook開發的四種本地Android應用程式中使用了單一的程式碼樹和構建工具,這讓開發更簡單、更流暢,錯誤更少。最初的38個庫在四種應用程式之間共享了500個模組。使用Buck替換了最初基於Ant的系統之後,第一次針對程式碼樹執行時,構建時間就從3分40秒降到1分30秒。
相比傳統的Android編譯工具,Buck憑藉多核及並行技術,極大加速了Android工程的編譯速度。同時,多次編譯過程中,它會對未變動的模組進行標記,以增量式編譯的方式進一步提高速度。Buck自帶編譯指令碼生成功能,並提供編譯過程中單元測試的程式碼覆蓋率等資料表單,還為無法用Ant工具編譯的模組提供了便捷的編譯方式。Buck跟IntelliJ結合緊密,可通過簡單的編譯指令碼生成該IDE可用的工程,極大降低了本地IDE開發後向伺服器遷移的成本。
彈簧模型Java庫:Rebound
Rebound是一個彈簧模型Java庫,由Facebook於2013年10月在[email protected]大會上釋出,旨在應用中引入真實的物理世界,建立讓人感覺很接近自然的動畫。Rebound不是通用物理庫,但是,彈簧模型能夠驅動各種各樣的動畫。Rebound的簡單特性使它很容易被整合,以及作為構建塊建立如呼叫、滾動條和切換開關等複雜元件。
移動應用互動設計工具:Origami
現在App的原型設計越來越複雜,以前使用PhotoShop製作靜態圖的方式不能滿足各種互動效果的展示,Paper的首席設計師Mike Matas在加入Facebook之初就推薦大家使用Quartz Composer來快速構建應用原型,而Facebook的設計團隊也很快接收並喜歡上了這個工具,在隨後的應用,他們遇到了一個問題:對於產品設計師來說,Quartz Composer 的學習曲線太高。
於是Mike就帶頭開發了Origami。2013年12月,Facebook 開源了基於 Quartz Composer 的外掛Origami,設計師可以通過 Origami 能夠快速構建移動應用互動原型,隨後交付給工程師實現,值得注意的是 Origami 無需程式設計背景,新發布的 Paper 從專案設計之初所有的原型設計都是採用 Origami 來實現。
UI測試工具:huxley
Huxley 是一個基於Python用於Web應用UI測試的工具,Huxley可以錄下UI操作過程,並回放自動測試。自動測試時和UI基準對比,UI不符合預期時,會儲存變化的 UI 並警告你。
Facebook iOS UI工具:ComponentKit
ComponentKit 使用功能性和宣告性(declarative)的方法來進行建立介面,和以往不同的是,ComponentKit 使用單向資料流的形式從不可變的模型對映到不可變的元件來確定檢視的顯示方式。ComponentKit 的 declarative 看上去和 declarative UI(QML) 差不多,其實差得遠。QML 更偏向於 UI 設計的描述性,而 ComponentKit 則是做好基本 UI 和事件之間的聯絡,讓事件設計和 UI 設計可以分開單獨完成。
iOS記憶體監測工具:FBMemoryProfiler
FBMemoryProfiler是Facebook開源的一款用於分析iOS記憶體使用和檢測迴圈引用的工具庫。
手機裝置的記憶體是一個共享資源。應用程式可能會不當的耗盡記憶體、崩潰,或者遭遇大幅度的效能降低。當分配了一塊記憶體,並設定了物件之後,如果在使用完了之後忘記釋放,這就會發生記憶體洩露。這意味著系統是無法回收記憶體並交予他人使用,這也最終意味著我們的記憶體將會逐漸耗盡。
在Facebook,有很多工程師在程式碼庫的不同部分上工作。這不可避免的會發生記憶體洩露。當發生記憶體洩露之後,工程師需要儘快找到並修復它們。一些工具已經可以找到記憶體洩露,但是它們需要大量的人工干預。自動化可以在不需要更多開發者的情況下,更快的找到記憶體洩露。為了解決這個問題,Facebook做了一套工具來自動化的處理和修復程式碼庫中的一些問題,這個工具就是FBMemoryProfiler。