貼吧是功能性產(chǎn)品,唯快不破是永恒的準則,這一特點決定了快速迭代是需要解決的關(guān)鍵性問題。快速迭代,分解開來有如下部分:開發(fā)階段,快速開發(fā);測試階段,包含了環(huán)境快速搭建、自動化測試工具;運維階段,包含了集群管理技術(shù)、自動化運維工具;同時,這三方面的工作需要一個整體性的解決方案銜接起來。
早期的貼吧,作為一個高性能社區(qū),功能相對單一,全部采用C語言開發(fā),系統(tǒng)可重用程度低,開發(fā)、測試效率低,運維方面的積累也很少。為了提高效率,開始嘗試 LAMP 架構(gòu),經(jīng)過幾年的發(fā)展,貼吧已全部遷移到了 LAMP。隨著產(chǎn)品規(guī)模急劇膨脹,30+ 子系統(tǒng),150+ 模塊,500+ 機器,10億+流量,在 LAMP 架構(gòu)方面積累了很多經(jīng)驗,逐漸形成了快速迭代的一體化方案。如下圖所示:
該解決方案由開發(fā)階段、測試階段、運維階段組成。開發(fā)階段又分成接入層、業(yè)務(wù)邏輯層、存儲層。該解決方案支撐大規(guī)模的線上應(yīng)用,同時保持了快速迭代的特性。基于該解決方案,開發(fā)人員能專注于業(yè)務(wù)邏輯開發(fā),測試人員能專注于持續(xù)集成,運維成本能大大降低。
開發(fā)
開發(fā)方面分為接入層、業(yè)務(wù)邏輯層、存儲層。
接入層處于瀏覽器和后端服務(wù)之間,用來解析 http 協(xié)議并組織成相應(yīng)的協(xié)議格式,完成客戶端和服務(wù)器之間的通信,還包括攻擊防范、頁面緩存、負載均衡等多種功能。Web Server 是其核心組成部分。接入層的目標是通過統(tǒng)一的方案提供簡單可依賴的接入層架構(gòu),經(jīng)過全面調(diào)研 Nginx 具有通用性強、效率高、功能全面、配置靈活等特點,是 webserver 未來發(fā)展的主力軍,確定采用 nginx 統(tǒng)一接入層。
業(yè)務(wù)邏輯層包含了 php 框架、業(yè)務(wù)邏輯、LIB 庫、交互層。業(yè)務(wù)邏輯層常常包含一些開發(fā)規(guī)范,這些規(guī)范就像法律一樣,我們不僅要有法可依,還要有法必依。在我們的解決方案中,PHP 框架=規(guī)范+庫,規(guī)范比如目錄部署規(guī)范、URL 規(guī)范、配置規(guī)范等,這些規(guī)范通過相應(yīng)的庫實現(xiàn),以達到有法必依的目的。
LIB 庫封裝常用的功能。基于這個解決方案,開發(fā)者開發(fā)應(yīng)用,只需完成業(yè)務(wù)邏輯部分。
中間層,如下圖所示,包含在業(yè)務(wù)邏輯層中,對于業(yè)務(wù)邏輯層的快速迭代非常重要。中間層對下做交互抽象,支持各種協(xié)議屏蔽協(xié)議細節(jié);通過資源定位屏蔽部署細節(jié);通過負載均衡提高系統(tǒng)穩(wěn)定性。中間層對上做接口抽象,支持服務(wù)整合、接口適配、公共邏輯。
中間層首先建立系統(tǒng)–子系統(tǒng)–模塊的體系,進行服務(wù)整合,圖中的 API-LIB 就是根據(jù)子系統(tǒng)劃分,將各模塊的接口(MIDL: Module IDL)轉(zhuǎn)化為子系統(tǒng)接口(SIDL: Service IDL);接口適配,SERVICE 的接口通過 SIDL 描述,讓接口描述、接口文檔、線上代碼等自動同步,可維護性大大提高,同時通過元數(shù)據(jù)規(guī)范保證全系統(tǒng)的接口一致,易用性大大提高;收斂公共邏輯,對于公共邏輯,比如權(quán)限邏輯,收斂起來可維護性大大提高。
存儲層,提供各種通用服務(wù)、組件。其中的通用數(shù)據(jù)存儲框架提供通用的數(shù)據(jù)存儲和訪問解決方案,以一種統(tǒng)一的設(shè)計模式來支持大多數(shù)數(shù)據(jù)存儲模塊的設(shè)計和實現(xiàn);統(tǒng)一數(shù)據(jù)訪問接口,對外部屏蔽數(shù)據(jù)拆分和存儲的細節(jié);做到數(shù)據(jù)存儲的良好擴展性,通過通用的數(shù)據(jù)拆分模式來應(yīng)對數(shù)據(jù)增長;將具有共性的需求抽象成通用服務(wù)或通用庫,以簡化設(shè)計和開發(fā)。
基于該解決方案,開發(fā)一個應(yīng)用只需要:在接入層配置相應(yīng)的分流,在業(yè)務(wù)邏輯層開發(fā)業(yè)務(wù)邏輯,使用存儲層合適的服務(wù)或基于框架完成數(shù)據(jù)模塊開發(fā)。能大大的提高開發(fā)效率,支持快速迭代。
測試
測試方面,為了支持快速迭代,必須提高自動化程度。而影響自動化的首要因素就是環(huán)境自動構(gòu)建,常見的問題有:環(huán)境復(fù)雜,比如關(guān)聯(lián)關(guān)系復(fù)雜;環(huán)境搭建代價過大;環(huán)境功能不完整等。采用基準環(huán)境能解決這一問題,項目上線后自動從 scmpf 更新到基準環(huán)境;測試環(huán)境/開發(fā)環(huán)境從基準環(huán)境同步。基于基準環(huán)境,系統(tǒng)級別的持續(xù)集成也成為可能,同時可以集中大量測試工具。
運維
運維方面面臨著很多問題:服務(wù)遷移成本高,環(huán)境不一致帶來各種回滾,機器利用率不均衡,運維自動化程度低。為了解決這些問題,提出 PHP 系統(tǒng)運維方案。環(huán)境同步方面,主要是代碼同步的問題,采用運維規(guī)范+監(jiān)控的方案;性能監(jiān)控方面,基于交互層完成請求狀態(tài)、交互性能監(jiān)控,基于調(diào)度中心獲取機器狀態(tài);機器調(diào)度方面,通過調(diào)度中心完成動態(tài)/半自動機器調(diào)度。如下圖所示:
展望
通過該 LAMP 解決方案,在開發(fā)、測試、運維方面都能極大的提高效率。未來在 LAMP 架構(gòu)方面,需要更多的在規(guī)范化、平臺化上下功夫。規(guī)范之后才能開展這種自動化的工作提高效率;平臺化可以把各種規(guī)范固化下來,提供自動化的支持。