在Facebook,Python是被使用最多的語言之一,受歡迎程度排行第三,僅次于Hack(Facebook出品的PHP變種)和C++。這聽起來可能會(huì)讓很多Python迷驚訝。事實(shí)上,F(xiàn)acebook的工程師構(gòu)建并且維護(hù)著上千個(gè)Python庫和項(xiàng)目,這些Python庫和項(xiàng)目在Facebook的生產(chǎn)環(huán)境中隨處可見。
每天,都有數(shù)十甚至上百個(gè)Facebook工程師為Python工具或服務(wù)貢獻(xiàn)代碼。這些工具或服務(wù)被用來做很多事情,比如二進(jìn)制分發(fā),硬件鏡像,操作自動(dòng)化,和基礎(chǔ)設(shè)施管理。
從數(shù)量上看Python在Facebook的地位
21%的Facebook架構(gòu)代碼
百萬行代碼,上千個(gè)庫和二進(jìn)制文件
2016年至今,平均每月5000個(gè)提交,1000個(gè)提交者。
到2016年5月,5%的Python代碼使用Python3
Python在運(yùn)維領(lǐng)域的應(yīng)用
Facebook的基礎(chǔ)設(shè)施團(tuán)隊(duì)大量使用Python,在生產(chǎn)環(huán)境中Python可以說無處不在。各個(gè)團(tuán)隊(duì)通常來說都會(huì)為他們自己的服務(wù)維護(hù)一個(gè)Python客戶端(一般是thrift),這個(gè)客戶端可以為其他團(tuán)隊(duì)提供簡(jiǎn)單可依賴的接口,以方便其他團(tuán)隊(duì)可以隨時(shí)調(diào)用他們的服務(wù)。
有了這些庫,產(chǎn)品工程師可以少寫大量的代碼,也減少了測(cè)試和維護(hù)的成本。使他們能夠快速地將自己的服務(wù)接入到Facebook的基礎(chǔ)架構(gòu)中,同時(shí)允許架構(gòu)有效可靠地?cái)U(kuò)展。
基礎(chǔ)設(shè)施管理
產(chǎn)品工程師擁有大多數(shù)的Python軟件,并用這些軟件來管理Facebook的基礎(chǔ)設(shè)施。即便其中的軟件不是100%由Python編寫,至少它也覆蓋了我們的硬件設(shè)施的整個(gè)生命周期,從硬件進(jìn)入我們的數(shù)據(jù)中心到它報(bào)廢的時(shí)刻。
Python軟件驅(qū)動(dòng)了這些服務(wù):
網(wǎng)絡(luò)切換設(shè)置和鏡像(TORconfig)
白盒切換CLI(FBOSS)
核心服務(wù)(DNS, Chef, etc.),通過Kobold,一個(gè)系統(tǒng)啟動(dòng)的可插拔系統(tǒng)
服務(wù)器硬件錯(cuò)誤和服務(wù)失敗的自動(dòng)修復(fù)(FBAR)
調(diào)度和自動(dòng)化執(zhí)行維護(hù)工作(Dapper)
服務(wù)器鏡像,老化測(cè)試和修復(fù)管理(Cyborg)
錯(cuò)誤檢測(cè)和診斷(machinechecker)
平臺(tái)服務(wù)
隨著我們的基礎(chǔ)設(shè)施規(guī)模化,一些單片服務(wù)被拆分成多個(gè)組件,過程中造就了大量各種用途的Python服務(wù)。
今天,我們大量的基礎(chǔ)設(shè)施管理工具都構(gòu)建在一個(gè)公用的平臺(tái)上,這個(gè)平臺(tái)由4個(gè)部分組成:
Job Engine:一個(gè)可規(guī)?;娜蝿?wù)調(diào)度和執(zhí)行框架,任何團(tuán)隊(duì)都可以基于自己的目的擴(kuò)展它,現(xiàn)在每個(gè)月運(yùn)行上百萬個(gè)任務(wù)。
fbpkg:一個(gè)基于BitTorrent的數(shù)據(jù)分發(fā)服務(wù),用來傳大文件和軟件包,包括facebook.com的代碼。
FBTFTP:我們的高性能TFTP實(shí)現(xiàn),支持IPv6,每一次服務(wù)器被鏡像都會(huì)使用到。
Osmosis:一個(gè)通用的工作流定義和執(zhí)行工具,很多團(tuán)隊(duì)都在使用。支持了我們從辦公室環(huán)境到數(shù)據(jù)中心環(huán)境的初始化,到操作系統(tǒng)和內(nèi)核的升級(jí)。
服務(wù)配置管理
我們主機(jī)級(jí)別的配置管理是用Chef完成的。我們服務(wù)級(jí)別的配置管理,是通過一個(gè)Facebook內(nèi)部的項(xiàng)目,叫Configerator,完成的。工程師們通過Python代碼生成配置對(duì)象,這些配置存儲(chǔ)在JSON文件中,任何的服務(wù)都能夠讀取。驗(yàn)證器,也是Python寫的,用來驗(yàn)證這些配置的正確性。Python還是項(xiàng)目Tupperware的配置語言,這個(gè)項(xiàng)目是Facebook的容器部署系統(tǒng)。
使用Python讓我們能夠動(dòng)態(tài)生成配置對(duì)象,而不用創(chuàng)建、維護(hù)、學(xué)習(xí)使用復(fù)雜的模板系統(tǒng)。
運(yùn)維效率
很多團(tuán)隊(duì)都在已經(jīng)存在的庫和系統(tǒng)上做定制,來提升自己的運(yùn)維效率或者滿足Facebook的通用需求。
我們的MySQL基礎(chǔ)設(shè)施團(tuán)隊(duì)創(chuàng)建了MySQL Pool Scanner,能夠像一個(gè)DBA一樣自動(dòng)保持我們的MySQL基礎(chǔ)設(shè)施的健康。
我們廣泛部署的二進(jìn)制文件(服務(wù)、代理、CLI工具等)使用slowroll orchestrator進(jìn)行傳輸,它是一個(gè)構(gòu)建在Job Engine基礎(chǔ)上的Python工具,它允許分段部署并且會(huì)自動(dòng)做安全檢查。
Python3部署
Facebook的規(guī)模使得Python的效率被使用到了極致,我們的代碼里使用了大量的庫(Twisted, Gevent, futures, AsyncIO, 和很多其他的)。很多的遷移項(xiàng)目或者新項(xiàng)目都使用Python3,除非有不得已的理由必須使用Python2。目前,我們運(yùn)行的服務(wù)中5%的代碼是用Python3編寫的。
下面這些兼容Python3的項(xiàng)目已經(jīng)開源了:
FBOSS CLI:一個(gè)Python3.5編寫的終端工具,用做主機(jī)切換的代理。
Facebook Python Ads API:兼容Python3
FBTFTP: Python3寫的動(dòng)態(tài)TFTP服務(wù)框架
PYAIB:Python異步IrcBot框架
在擴(kuò)真我們的Python3代碼的時(shí)候有很多令人興奮的事情要做。我們?cè)絹碓揭蕾囉贏syncIO,這個(gè)Python3.4加入的特性。從Python2遷移而來我們見證了巨大的性能提升。我們希望貢獻(xiàn)更多提高性能的特性和修復(fù)給Python社區(qū)。
了解野狗,請(qǐng)點(diǎn)擊閱讀原文
聯(lián)系客服