我們的應(yīng)用系統(tǒng)是如何支撐千萬級別用戶的
背景
我現(xiàn)在負責(zé)的項目是一個合同型項目,也就是甲乙方關(guān)系。目前我們系統(tǒng)累計用戶數(shù)約2500萬+,日活躍200萬+。而今年客戶的KPI指標是用戶總數(shù)翻一翻。而剛好這幾天我需要給客戶匯報一份關(guān)于“如何支撐數(shù)千萬級別用戶”的系統(tǒng)報告。借此機會,也順帶多寫一份分享心得。
前序
從項目性質(zhì)可以看出,我們公司就是一個IT服務(wù)企業(yè),既然是服務(wù),那么客戶的滿意就是我們前進的動力,注意是客戶而不是用戶??蛻籼岢鲞@個匯報要求,無非要的就是我們能否協(xié)助他們完成KPI的信心。再進一步說,就是我們開發(fā)的系統(tǒng)能否很好地支撐他們達到業(yè)務(wù)和用戶的KPI目標。首先我會想到的一點是,今年將會是一個怎樣的數(shù)千萬用戶級別系統(tǒng),也就是說這個數(shù)千萬用戶系統(tǒng)的背后需要支撐什么樣的業(yè)務(wù)目標。例如數(shù)千萬用戶的秒殺和數(shù)千萬用戶的查詢還是有天大的區(qū)別。按照我對該行業(yè)客戶的了解,我是無法從中得知太多有利用價值的商業(yè)信息。所以他們實際要的就是一個“能快速響應(yīng)、隨機應(yīng)變且能支撐數(shù)千萬用戶的系統(tǒng)”。能快速響應(yīng)意味著我們要隨時能跟上他們緊急的需求新增或緊急的需求變更;隨機應(yīng)變也就意味著他們想做什么就做什么且不能拒絕;數(shù)千萬用戶就是一個代表并發(fā)的量詞,他不會告訴你這數(shù)千萬用戶什么時候一個個來或什么時候會一起來??蛻魧ο到y(tǒng)的要求也不多,也就“穩(wěn)定、靈活、可擴展和敏捷開發(fā)”四個要求。下面就來說說我將會通過什么樣的手段來滿足客戶的欲望。
主題
從宏觀角度看,一個系統(tǒng)并非只是一個硬件+軟件的集合那么簡單,它還涉及到其它方方面面的因素,這些因素間相互緊密關(guān)聯(lián),比如公關(guān)做不好或者業(yè)務(wù)方向偏軌,系統(tǒng)再好,也無補于事。從微觀角度看,一個系統(tǒng)并非只是需求、開發(fā)、測試的事情,我們還要考慮運維、實施等項目階段成員的感受。一個項目的最大難度可能不是開發(fā),或許可能是運維。一個項目的復(fù)雜度會隨著時間的遷移或者骨干人員的變動而指數(shù)增加。從這些方面去考慮,這個系統(tǒng)必須保持足夠的“簡單”,才能降低項目的各種成本。當然,越簡單越復(fù)雜,最終依賴的還是一個“簡單”的團隊。
簡單的框架
從上圖得知,該系統(tǒng)是一個面向服務(wù)體系結(jié)構(gòu)(SOA)系統(tǒng),也是“簡單”的首先。該系統(tǒng)主張的是把所有服務(wù)組件化,最大的組件粒度是平臺,例如運營平臺、外部服務(wù)支撐平臺、內(nèi)部服務(wù)支撐平臺等。而最小的組件粒度是服務(wù)。組件化也是系統(tǒng)靈活性和可擴展性的必要因素。平臺垂直分為入口層和業(yè)務(wù)層,下面分別介紹一下。
入口層
入口層的主要職責(zé)就是充當業(yè)務(wù)系統(tǒng)門衛(wèi),檢查業(yè)務(wù)請求的合法性,各檢查組件之間松耦合,沒有任何關(guān)聯(lián),隨時能刪能減,不會影響整個系統(tǒng)的穩(wěn)定性。
業(yè)務(wù)層
顧名思義,業(yè)務(wù)層的主要職責(zé)負責(zé)對業(yè)務(wù)的邏輯處理,并響應(yīng)用戶業(yè)務(wù)請求。該業(yè)務(wù)層主要包含參數(shù)驗證、邏輯處理、響應(yīng)請求三大步驟。一個業(yè)務(wù)實體代表一種服務(wù),各業(yè)務(wù)實體之間同樣是松耦合,沒有任何關(guān)聯(lián),缺少任何一種業(yè)務(wù)都不會導(dǎo)致系統(tǒng)的崩潰。
輔助組件工具包
這個工具包包含各種通用輔助組件,主要職責(zé)是輔助入口層和邏輯層各組件的執(zhí)行,例如數(shù)據(jù)庫操作組件、Redis操作組件等。
該系統(tǒng)的主要特點有:
1、控制業(yè)務(wù)粒度復(fù)雜度
沒有不能簡單的功能,只有乳臭未干的設(shè)計者。一個業(yè)務(wù)也相當于一個組件。一個過于復(fù)雜的組件無論從運維還是性能來說都是噩夢的開始。如果每一個組件都有它的“自管”能力,后續(xù)的運維工作就會大大的降低。
2、控制線程棧的大小
一個業(yè)務(wù)線程棧過大也就意味著線程執(zhí)行時間不會太短,對于一個互聯(lián)網(wǎng)應(yīng)用,每一毫秒都是系統(tǒng)體驗的關(guān)鍵所在。
3、控制系統(tǒng)透明度
所謂的透明度也就是線程棧的透明度,就是每個程序員都必須非常清晰的理解自己的線程棧將會如何運行,在什么地方會存在異常風(fēng)險,如何處理等操作手段。也因為這樣,整個系統(tǒng)沒有使用任何其它的“業(yè)務(wù)邏輯開源框架”,大大地降低了開發(fā)人員的學(xué)習(xí)成本和壓力,也大大地提高了系統(tǒng)的可控性。可以讓程序員接觸更多基礎(chǔ)的東西。包括數(shù)據(jù)庫的操作也是需要開發(fā)人員自己親手去寫業(yè)務(wù)的SQL語句,并保證SQL語句的性能消耗。當然,這也需要開發(fā)人員對數(shù)據(jù)庫有一定的了解程度。
4、控制業(yè)務(wù)驗證
對任何業(yè)務(wù)的請求都必須保持不可信任的態(tài)度,這也是業(yè)務(wù)實例的第一步就是做請求參數(shù)驗證的必要性。服務(wù)是對外的,誰也不敢確保沒有惡意的攻擊,這個一個系統(tǒng)必須考慮的邊界因素。否則系統(tǒng)毫無安全性可言。
簡單的部署
部署同樣遵守組件化、控制業(yè)務(wù)復(fù)雜粒度等原則。確保每個垂直的部署都是一個獨立的業(yè)務(wù)集群,每個業(yè)務(wù)集群必須控制好業(yè)務(wù)的復(fù)雜度,好比如一個細胞成長到一定程度會自動分裂出兩個細胞,否則脹爆是唯一的后果。從以上架構(gòu)圖中左邊的兩個箭頭和系統(tǒng)特性得知,該系統(tǒng)可橫向平臺分解部署或同一平臺中業(yè)務(wù)分解部署,大概的部署效果如下圖所示:
如果資源和業(yè)務(wù)允許,各垂直集群硬件的獨立性也是必要的,盡可能確保各部署集群之間的松耦合。對于實施人員來說,每個集群業(yè)務(wù)的部署,只需要從項目中提出屬于該集群的組件增量部署即可。
簡單的監(jiān)控
監(jiān)控程序同樣是系統(tǒng)的重要組成部分,也意味著監(jiān)控程序必須遵守以上系統(tǒng)原則去實現(xiàn),并監(jiān)控程序也是需要維護的。
總結(jié)
不難看出,整個系統(tǒng)都是體現(xiàn)組件化原則。每個層次的結(jié)構(gòu)都可以通過水平橫向組件化擴展來增加系統(tǒng)的支撐能力,這就是系統(tǒng)原則一致性的表現(xiàn)。隨著時間的推移,業(yè)務(wù)復(fù)雜度不會因此而增加,只會橫向地擴展更多的服務(wù)支撐。從系統(tǒng)架構(gòu)特性也可以看出,對硬件資源的消耗也是非常的低,畢竟線程棧的大小也放在哪兒了,這一點也得到了客戶的認可。此架構(gòu)已經(jīng)在線上支撐著每天200多萬用戶的使用,整一年下來故障率為0。
這個系統(tǒng)的學(xué)習(xí)成本也是非常低的,因為是都基礎(chǔ)知識。雖然簡單,但對人員的綜合能力是有一定的要求。例如開發(fā)人員需要對整條訪問線程的各個部分都要有所了解,例如網(wǎng)絡(luò)、中間件、語言、緩存、數(shù)據(jù)庫等知識,否則馬不停蹄的救火和調(diào)優(yōu)是未來可預(yù)知的事情。因為一個習(xí)慣了簡單開發(fā)的程序員開發(fā)不了簡單的簡單的程序。其實對于整個系統(tǒng)項目組干系人來說,理解系統(tǒng)架構(gòu)是首要條件。否則,如果沒有整體觀念的理解,如何做好部分。
作者@?wc的一些事一些情
來源@博客園
本文由 @wc的一些事一些情 授權(quán)發(fā)布于人人都是產(chǎn)品經(jīng)理?,未經(jīng)許可,禁止轉(zhuǎn)載。
我可能是一個假的產(chǎn)品經(jīng)理 ??