資源描述:
《淘寶網(wǎng)高性能可伸縮架構(gòu)技術(shù)探秘.docx》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、淘寶網(wǎng)高性能可伸縮架構(gòu)技術(shù)探秘在《世界最大的PHP站點Facebook后臺技術(shù)探秘》一文中介紹了一個大型SNS網(wǎng)站的技術(shù)組成。今天我們繼續(xù)大型網(wǎng)站探秘,一起來探秘淘寶網(wǎng)的架構(gòu)技術(shù)。作為國內(nèi)最大的B2C網(wǎng)站,淘寶網(wǎng)的網(wǎng)站架構(gòu)一直承載著數(shù)據(jù)量告訴增長壓力,要保證良好的負載和流程的使用體驗,一個可伸縮性的高性能網(wǎng)站架構(gòu)必不可少。一、應(yīng)用無狀態(tài)一個系統(tǒng)的伸縮性的好壞取決于應(yīng)用的狀態(tài)如何管理。試想一下,假如我們在session中保存了大量與客戶端的狀態(tài)信息的話,那么當保存狀態(tài)信息的server宕機的時候,我們怎么辦?通常來說,我們都是通過集群來解決這個問題,而通常所說的集群,不僅有負載均衡,
2、更重要的是要有失效恢復(fù)failover,比如tomcat采用的集群節(jié)點廣播復(fù)制,jboss采用的配對復(fù)制等session狀態(tài)復(fù)制策略,但是集群中的狀態(tài)恢復(fù)也有其缺點,那就是嚴重影響了系統(tǒng)的伸縮性,系統(tǒng)不能通過增加更多的機器來達到良好的水平伸縮,因為集群節(jié)點間session的通信會隨著節(jié)點的增多而開銷增大,因此要想做到應(yīng)用本身的伸縮性,我們需要保證應(yīng)用的無狀態(tài)性,這樣集群中的各個節(jié)點來說都是相同的,從而是的系統(tǒng)更好的水平伸縮。上面說了無狀態(tài)的重要性,那么具體如何實現(xiàn)無狀態(tài)呢?此時一個session框架就會發(fā)揮作用了。幸運的是公司已經(jīng)具有了此類框架。公司的session框架采用的是cl
3、ientcookie實現(xiàn),主要將狀態(tài)保存到了cookie里面,這樣就使得應(yīng)用節(jié)點本身不需要保存任何狀態(tài)信息,這樣在系統(tǒng)用戶變多的時候,就可以通過增加更多的應(yīng)用節(jié)點來達到水平擴展的目的.但是采用客戶端cookie的方式來保存狀態(tài)也會遇到限制,比如每個cookie一般不能超過4K的大小,同時很多瀏覽器都限制一個站點最多保存20個cookie.公司cookie框架采用的是“多值cookie”,就是一個組合鍵對應(yīng)多個cookie的值,這樣不僅可以防止cookie數(shù)量超過20,同時還節(jié)省了cookie存儲有效信息的空間,因為默認每個cookie都會有大約50個字節(jié)的元信息來描述cookie。
4、除了公司目前的session框架的實現(xiàn)方式以外,其實集中式session管理來完成,說具體點就是多個無狀態(tài)的應(yīng)用節(jié)點連接一個session服務(wù)器,session服務(wù)器將session保存到緩存中,session服務(wù)器后端再配有底層持久性數(shù)據(jù)源,比如數(shù)據(jù)庫,文件系統(tǒng)等等。二、有效使用緩存做互聯(lián)網(wǎng)應(yīng)用的兄弟應(yīng)該都清楚,緩存對于一個互聯(lián)網(wǎng)應(yīng)用是多么的重要,從瀏覽器緩存,反向代理緩存,頁面緩存,局部頁面緩存,對象緩存等等都是緩存應(yīng)用的場景。一般來說緩存根據(jù)與應(yīng)用程序的遠近程度不同可以分為:localcache和remotecache。一般系統(tǒng)中要么采用localcache,要么采用remo
5、tecache,兩者混合使用的話對于localcache和remotecache的數(shù)據(jù)一致性處理會變大比較麻煩.在大部分情況下,我們所說到的緩存都是讀緩存,緩存還有另外一個類型:寫緩存.?對于一些讀寫比不高,同時對數(shù)據(jù)安全性需求不高的數(shù)據(jù),我們可以將其緩存起來從而減少對底層數(shù)據(jù)庫的訪問,比如統(tǒng)計商品的訪問次數(shù),統(tǒng)計API的調(diào)用量等等,可以采用先寫內(nèi)存緩存然后延遲持久化到數(shù)據(jù)庫,這樣可以大大減少對數(shù)據(jù)庫的寫壓力。以店鋪線的系統(tǒng)為例,在用戶瀏覽店鋪的時候,比如店鋪介紹,店鋪交流區(qū)頁面,店鋪服務(wù)條款頁面,店鋪試衣間頁面,以及店鋪內(nèi)搜索界面這些界面更新不是非常頻繁,因此適合放到緩存中,這樣
6、可以大大減低DB的負載。另外寶貝詳情頁面相對也更新比較少,因此也適合放到緩存中來減低DB負載。三、應(yīng)用拆分首先,在說明應(yīng)用拆分之前,我們先來回顧一下一個系統(tǒng)從小變大的過程中遇到的一些問題,通過這些問題我們會發(fā)現(xiàn)拆分對于構(gòu)建一個大型系統(tǒng)是如何的重要。系統(tǒng)剛上線初期,用戶數(shù)并不多,所有的邏輯也許都是放在一個系統(tǒng)中的,所有邏輯跑到一個進程或者一個應(yīng)用當中,這個時候因為比較用戶少,系統(tǒng)訪問量低,因此將全部的邏輯都放在一個應(yīng)用未嘗不可。但是,兄弟們都清楚,好景不長,隨著系統(tǒng)用戶的不斷增加,系統(tǒng)的訪問壓力越來越多,同時隨著系統(tǒng)發(fā)展,為了滿足用戶的需求,原有的系統(tǒng)需要增加新的功能進來,系統(tǒng)變得越
7、來越復(fù)雜的時候,我們會發(fā)現(xiàn)系統(tǒng)變得越來越難維護,難擴展,同時系統(tǒng)伸縮性和可用性也會受到影響。那么這個時候我們?nèi)绾谓鉀Q這些問題呢?明智的辦法就是拆分(這也算是一種解耦),我們需要將原來的系統(tǒng)根據(jù)一定的標準,比如業(yè)務(wù)相關(guān)性等分為不同的子系統(tǒng),不同的系統(tǒng)負責不同的功能,這樣切分以后,我們可以對單獨的子系統(tǒng)進行擴展和維護,從而提高系統(tǒng)的擴展性和可維護性,同時我們系統(tǒng)的水平伸縮性scaleout大大的提升了,因為我們可以有針對性的對壓力大的子系統(tǒng)進行水平擴展而不會影響到其它的子