Facebook開源軟體列表

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開發者所習慣的靈活性。

  • GitHub主頁:https://github.com/facebook/hhvm

  • Star數量:13652

JavaScript庫:React

React是Facebook開發的用於構建用戶界面的JavaScript庫,現已為很多公司所用,因為它採用了一種不同的方式來構建應用:藉助於React,開發者可以將應用分解為彼此解耦的獨立組件,這樣就可以獨立維護並迭代各種組件了。2015年,React有兩個主要的發佈,同時還發布了React Native,並且發佈了新的開發者工具。現在已經有越來越多的公司(包括Netflix與WordPress)開始使用React構建自己的產品了。

  • GitHub主頁:https://github.com/facebook/react

  • Star數量:43146

鍵值存儲系統: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的實現

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有很大的區別,但使用上非常相似。

  • GitHub主頁:https://github.com/facebook/pop

  • Star數量:15468

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新增了類型語法,如類型別名。

  • GitHub主頁:https://github.com/facebook/flow

  • Star數量:7510

Haskell庫:Haxl

Facebook開源了Haxl,一個為高效併發數據訪問而開發的庫。這個庫 一方面利用了Haskell的傳統優勢,比如表達力很強的類型系統、對正確性和安全性的保障,另一方面也受益於GHC(Haskell編譯器)的高性能運行時庫,解決煩人的隱式併發數據訪問的問題。Haxl簡化了對遠程數據的訪問,比如數據庫或網站服務。對同一數據源的多個訪問請求,或同時從不同的數據源請求數據,它都能批量處理,並且緩存上一次的結果。

  • GitHub主頁:https://github.com/facebook/Haxl

  • Star數量:2257

Web應用架構:Flux

Facebook認為MVC無法滿足他們的擴展需求,因此他們決定使用另一種模式:Flux。由於Facebook非常巨大的代碼庫和龐大的組織,所以MVC真的很快就變得非常複雜,於是他們得出結論,認為MVC不適合於大規模應用。

每次Facebook工程師努力增加一項新特性時,系統的複雜性成級數增長,代碼變得“脆弱和不可預測”。對於剛接觸某個代碼庫的開發人員來說,這正成為一個嚴重的問題。Flux是一個Facebook開發的、利用單向數據流實現的應用架構,用於 React。Flux應用有三個主要的部分組成:調度程序、存儲和視圖(React 組件)。

  • GitHub主頁:https://github.com/facebook/flux

  • Star數量:11616

JavaScript單元測試工具:Jest

Jest是一個開源的、基於Jasmine框架的JavaScript單元測試工具。Jest源於Facebook兩年前的構想,用於快速、可靠地測試Web聊天應用。它吸引了公司內部的興趣,Facebook的一名軟件工程師Jeff Morrison半年前又重拾這個項目,改善它的性能,並將其開源。

在最基礎層面,Jest被設計用於快速、簡單地編寫地道的JavaScript測試。Jest自動模擬require返回的CommonJS模塊,並提供了包括內置的測試環境Dom API支持、合理的默認值、預處理代碼和默認執行並行測試在內的特性。通過在並行進程中同時運行測試,Jest讓測試更快地結束。

  • GitHub主頁:https://github.com/facebook/jest

  • Star數量:4119

基於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開發後向服務器遷移的成本。

  • GitHub主頁:https://github.com/facebook/buck

  • Star數量:2686

彈簧模型Java庫:Rebound

Rebound是一個彈簧模型Java庫,由Facebook於2013年10月在Mobile@Scale大會上發佈,旨在應用中引入真實的物理世界,創建讓人感覺很接近自然的動畫。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。


分享到:


相關文章: