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