中大型移動(dòng)互聯(lián)網(wǎng)公司技術(shù)架構(gòu)選擇思考
總體思考
總結(jié)這些年經(jīng)驗(yàn),進(jìn)行構(gòu)架演進(jìn)的方向選擇時(shí),大致要做到下面的目標(biāo):
- 可快速開(kāi)發(fā)部署 (五分鐘寫(xiě)出來(lái)一個(gè)經(jīng)過(guò)測(cè)試的hello world并可訪問(wèn)/調(diào)用,并可在公網(wǎng)訪問(wèn))
- 天然可擴(kuò)展(業(yè)務(wù)層無(wú)狀態(tài),盡可能全部放到***)
- 自動(dòng)化(內(nèi)存不足了,除了報(bào)警,應(yīng)該自動(dòng)加點(diǎn)機(jī)器進(jìn)去; 新的項(xiàng)目,基礎(chǔ)代碼應(yīng)該都不用寫(xiě),自動(dòng)生成即可)
- 框架化(公共層面的東西盡可能框架化,一層類似日志、counter、trace,應(yīng)該不需要開(kāi)發(fā)再寫(xiě)一行代碼即默認(rèn)打開(kāi))
- 量化(所有的調(diào)用都應(yīng)該有percentile與rps,透明反饋服務(wù)質(zhì)量,跟蹤系統(tǒng)更是可以模擬用戶進(jìn)行系統(tǒng)內(nèi)部)
- 同構(gòu)化(因?yàn)楦銉商椎某杀揪薮?,整體應(yīng)該越來(lái)越趨同于同一種語(yǔ)言)
- 硬件虛擬化(整個(gè)平臺(tái)應(yīng)該對(duì)進(jìn)程透明下面的硬件情況)
- 版本化、灰度化(所有的軟件都應(yīng)該在線上有明確的版本,且上線過(guò)程是一點(diǎn)點(diǎn)灰度上)
上圖純手繪花了些時(shí)間,本文以此圖從上到下的順序進(jìn)行描述。
用戶
在移動(dòng)互聯(lián)網(wǎng)環(huán)境下,用戶會(huì)被分為好網(wǎng)絡(luò)的用戶和壞網(wǎng)絡(luò)的用戶,我們要為壞網(wǎng)絡(luò)的用戶盡一切可能提供合適的鏈路和可靠的DNS。
接入層
在接入層的代碼層面,需要準(zhǔn)備client-server套件,這意味著,需要一個(gè)同時(shí)了解android\ios..等客戶端和服務(wù)器端開(kāi)發(fā)的團(tuán)隊(duì),專門(mén)打造網(wǎng)絡(luò)套件。
- 這一層的目標(biāo)是,讓客戶端開(kāi)發(fā)人員不再關(guān)心網(wǎng)絡(luò)協(xié)議的問(wèn)題。
業(yè)務(wù)接入層
這一層的目標(biāo)是靈通機(jī)動(dòng)調(diào)配流量,往往大家的方案都是LVS,或者是F5等。更高大上一點(diǎn),再上一些流量分析設(shè)備,在有突增的時(shí)候好用來(lái)找問(wèn)題。
業(yè)務(wù)層
在統(tǒng)一的業(yè)務(wù)框架下,去完成各個(gè)靈活組織的BIZ邏輯,這里就涉及到異構(gòu)系統(tǒng)對(duì)一個(gè)大型公司的影響。
- 如果80%的人都在使用java的活,還是趁早全用java,因?yàn)橐馕吨O?0%用其他語(yǔ)言的同學(xué),有可能要把這80%的同學(xué)做的基礎(chǔ)全部實(shí)現(xiàn)一遍。
- 異構(gòu)必然會(huì)導(dǎo)致某些模塊不能***工作,比如后續(xù)的RPC、配置管理、監(jiān)控報(bào)警、跟蹤系統(tǒng)等等。
RPC框架與隊(duì)列
二者一起完成數(shù)據(jù)在IDC的傳遞,不同在于,一個(gè)是同步,一個(gè)是異步。
- 統(tǒng)一的RPC框架好處不必言說(shuō)。
配置管理
zookeeper當(dāng)選***角色,上點(diǎn)規(guī)模的服務(wù)里基本都會(huì)有zk的身影。
日志系統(tǒng)
統(tǒng)一的日志系統(tǒng),對(duì)未來(lái)發(fā)展中所需要的各種數(shù)據(jù)更加容易得到。日志系統(tǒng)的特點(diǎn)要求:快,容網(wǎng)絡(luò)錯(cuò)誤,部署簡(jiǎn)單,進(jìn)程穩(wěn)定,可水平擴(kuò)展。
- scribe與kafka都是不錯(cuò)的選擇。
- 這里最終的日志,可能會(huì)需要放到hdfs或者是hbase里進(jìn)行hive查詢,否則數(shù)據(jù)量大了之后要想把日志用起來(lái)很不容易。
監(jiān)控報(bào)警系統(tǒng)
ganglia與nagios仍舊是***用的開(kāi)源管理軟件。
- 需要考慮的是,要將在業(yè)務(wù)框架里默認(rèn)記錄的公共的perfcounter進(jìn)行監(jiān)控與報(bào)警。
跟蹤系統(tǒng)
當(dāng)系統(tǒng)出現(xiàn)bug的時(shí)候,用來(lái)快速debug,當(dāng)服務(wù)越來(lái)越多的時(shí)候,跟蹤系統(tǒng)是個(gè)必不可少的工具。
- twitter的zipkin是個(gè)不錯(cuò)的開(kāi)源的實(shí)現(xiàn),不過(guò)要使用到自家的代碼里來(lái),可能要加工一下。
PAAS Agent Daemon
整體統(tǒng)一的運(yùn)維平臺(tái)的客戶端程序,此程序負(fù)責(zé):向監(jiān)控系統(tǒng)匯報(bào)硬件及網(wǎng)絡(luò)數(shù)據(jù),啟動(dòng)和停止應(yīng)用程序,向監(jiān)控系統(tǒng)和PAAS平臺(tái)傳遞應(yīng)用程序的運(yùn)行狀態(tài)。
存儲(chǔ)平臺(tái)
此層包括所有重狀態(tài)的hosting service。
- memcached cluster,使用統(tǒng)一的一致性hash客戶端,所有的緩存服務(wù)器進(jìn)行統(tǒng)一管理,計(jì)算命中率、使用率,實(shí)時(shí)添加內(nèi)存。
- DBMS cluster,使用統(tǒng)一的數(shù)據(jù)庫(kù)分庫(kù)分表層,動(dòng)態(tài)地感知和切換故障。常見(jiàn)的項(xiàng)目如mysqlproxy,變形蟲(chóng)。
- HBase cluster,獨(dú)立的存儲(chǔ)可用性保障,本身也是設(shè)計(jì)為高可用性的集群。
PAAS 資源控制層
目標(biāo)是實(shí)時(shí)反饋整個(gè)或多個(gè)IDC內(nèi)部的內(nèi)存還有多少、CPU是否夠用、下次采購(gòu)還需要多少機(jī)器。
- 虛擬化是個(gè)重點(diǎn)難題。常見(jiàn)開(kāi)源軟件:docker、warden、LXC。
- 資源控制CPU可用cgroups,磁盤(pán)可用aufs等,一般的虛擬化方案中都已經(jīng)包括這幾項(xiàng)解決辦法。
PAAS用戶界面層
這一層主要面向運(yùn)維和開(kāi)發(fā)人員,比如用來(lái)上線服務(wù)、添加刪除機(jī)器。
- 除了web界面,還應(yīng)該有cli模式的支持。
自動(dòng)部署層
一般都以hudson的CI(持續(xù)構(gòu)建)完成之后進(jìn)行,但可自動(dòng)化的部署一定需要測(cè)試框架非??孔V,以及測(cè)試代碼靠譜,否則就是個(gè)悲劇。
測(cè)試框架
借用一些高級(jí)框架,讓代碼寫(xiě)少一點(diǎn),比如jmockit、spring-test等等。
編譯工具
java的maven為不二選擇。編譯好的包倉(cāng)庫(kù),推薦nexus。
代碼生成
開(kāi)發(fā)人員不需要重復(fù)進(jìn)行操作,只要框架是固定的,所有的代碼應(yīng)該都是可以生成的。只需要花精力去修改核心邏輯。
- 這里比較抽象,可以用的辦法比如做一個(gè)maven-plugin,讓全部工程師都會(huì)用。
- 不斷地去升級(jí)這個(gè)工具,使其包括更多的可能的代碼方式。
代碼質(zhì)量
在工程師的代碼完成之后,跑一遍靜態(tài)分析,可以提前發(fā)現(xiàn)一些問(wèn)題,可以做成定期的模式,與持續(xù)集成放在一起。
- 推薦hudson + maven + sonar三劍合一。
代碼及常規(guī)系統(tǒng)
- 代碼托管:gitlab是一個(gè)不錯(cuò)的類似github(越來(lái)越像了)的工具。
- codereview:可直接使用gitlab的merge request,也可以使用開(kāi)源的reviewboard。
- 知識(shí)管理:沒(méi)什么好說(shuō)的,mediawiki。
- 需求與bug:jira。
- 故障管理:這個(gè)沒(méi)有開(kāi)源項(xiàng)目,post-mortem system,是一種記錄故障原因的系統(tǒng),下一次故障來(lái)臨的時(shí)候,來(lái)這個(gè)系統(tǒng)里進(jìn)行問(wèn)卷式的調(diào)查和反思。
PAAS for DEV & TEST
- 開(kāi)發(fā)階段需要之前提到的cli可發(fā)布到自己的開(kāi)發(fā)機(jī)(這里還需要PAAS可很容易地開(kāi)一個(gè)新的開(kāi)發(fā)機(jī))的工具。
- 測(cè)試階段需要比開(kāi)發(fā)階段更加高可用性的環(huán)境,而且要時(shí)刻提升基礎(chǔ)工具的可靠性,不應(yīng)該讓開(kāi)發(fā)環(huán)境在發(fā)展中消失,反而用測(cè)試環(huán)境來(lái)當(dāng)作開(kāi)發(fā)環(huán)境,現(xiàn)實(shí)中發(fā)生此類事件的原因,都是部署沒(méi)有做到***。