綠茶成立初期時,需要快速實現最基本的數據下發功能,早期的架構采用最簡單的模式,如下圖所示:
GreenTea_1.0.png
基于該架構,可以實現很多功能,如:
* 網址導航(可區分城市)
* 數據下發(各種數據接口)
* 運營接口(支持IP授權認證)
在數據量沒有上來之前,該架構是非常好用的
隨著業務的擴充和用戶的上升同時為了容災,我們將架構調整為:
GreenTea_2.0.png
該架構在很長一段時間內支持了綠茶絕大多數服務,并運行良好,同時我們發現了一些問題:
* 數據庫主從使用率不高,基本都走主庫;
* Redis的key分配策略由PHP框架控制,因此其它語言要想用Redis集群需要通過PHP的Redis接口,會有一定的性能損耗;
* 當流量抖動時,偶爾會有nginx連接php報502 bad gateway的現象;
后來,我們壓測了Nginx、PHP、Mysql、Redis得出如下現象:
QQ圖片20160228194617.png
然后,我們就想,有沒有辦法進一步提升框架的性能,這時就去偉大的Google上尋找答案,忽然就發現了OpenResty及相關的開源社區,經過初步的調研和性能測試發現,ngx_lua的性能幾乎等同于Nginx而且非常好用,然后我們就基于OpenResty開發了數據下發框架Luant,經過壓力測試,發現Luant的性能和Nginx相當,比原PHP框架并發能力提升了3倍。這時,我就準備將原有的服務依緊急程度逐漸遷移并在遷移的過程中不斷優化新的架構。然后,我就遇到了一個問題,如何實現Redis集群和Mysql集群?是不是把集群調度策略在Lua里再實現一次?這時,我想起了當年流傳在架構組的一句話:
計算機科學領域的所有問題都可以通過引入中間件來解決。
無獨有偶,我又去萬能的Google和開源社區找輪子去了,經過對相關解決方案的調研和性能測試,最終選擇了Codis和Atlas來作為我們的數據中間件,后來,我們的架構就演化成:
Greentea_3.0.png
Redis集群.png
Mysql集群.png
該架構屬于初次搭建,還沒有經過時間的檢驗,但就目前來看,還是靠譜的。
* Reids和Mysql集群提供Http接口,無語言限制
* 開發了Lua和PHP的RPC調用插件(隨機輪詢算法),使上層開發者無需關心使用細節
* Lua和PHP框架均可用于數據下發,對于高并發的服務,會盡量用Lua實現
以上就是綠茶后臺架構到目前為止的演化過程,之后一定還會再發生變化。對于像綠茶這樣的小團隊來說,人力是最貴的資源,要知道:
永遠都不要重復造輪子,除非非造不可
還有:
當你只需要一個針時,千萬不要去磨鐵棒
除非,有的是資源或者只是為了好玩。
謝謝觀賞。