淘宝李晓拴:淘宝网PHP电子商务应用
源自:http://tech.qq.com/a/20110512/000298.htm
大家好,大家知道淘寶搜索是一個典型PHP架構(gòu)。在座同學不知道有多少人使用過淘寶搜索可以舉手示意一下?在開始這個話題之前我們先談一下Polyglot,多語言混合編程,淘寶有很多系統(tǒng)是利用Java來開發(fā)的。淘寶大概有上千名Java工程師,也做了非常多Java工作,我們?yōu)槭裁催€要選擇PHP呢?一方面來講我們利用一些外部動態(tài),PHP開發(fā)效率更高一些,另外我們技術(shù)熟練程度。
所以,也有應了那句話“沒有最好,只有最適合”。其實我們發(fā)現(xiàn)不管是任何語言來講,Java也好,PHP也好和C也好,我們會利用Java做一些接口,利用PHP來寫一些VO的功能,同時也會利用C寫一些PHP擴展。接下來進入我們今天第一個話題,搜索產(chǎn)品介紹。正如大家所看到一樣,這個就是我們淘寶搜索首頁,非常簡單一個搜索框一個搜索按紐,下面是一些熱門關(guān)健詞,當你搜索之后就會進入我們搜索結(jié)果頁,看上去有點復雜。只要大家用過淘寶,基本上大家都可能進入這樣一個頁面。
今天主要內(nèi)容就是講解這個頁面,還有其他搜索產(chǎn)品,一淘,是淘寶面向站外用戶推出電子商務(wù)搜索引擎,這是一淘的首頁,和淘寶搜索其他產(chǎn)品一樣,也是標準的LAMP架構(gòu)。接下來一個產(chǎn)品是我們的排行榜,和前面有一些差別,使用NGS來做,排行榜有非常多靜態(tài)內(nèi)容,我們在服務(wù)器選題上采用了NGS。
接下來我來講一講淘寶搜索整體架構(gòu),講架構(gòu)之前,可能會講一下共同模塊,這樣大家對理解架構(gòu)更加容易。首先,看一下網(wǎng)絡(luò),這張圖其實是一個非常簡單的落說明圖,用戶訪問搜索域名,會根據(jù)用戶IP定位到不同機房,比如有電信機房,網(wǎng)通機房,和教育網(wǎng)。為什么有三個機房呢?第一是有中國特殊國情決定的,第二也是為了容災,每個機房大概都有幾十臺機器。淘寶搜索每天流量也在每天幾億,我們每個機房部署幾十臺機器來控制流量。
這些機器主要來請求PHP,頁面還有很多資源文件,像CSC,還有圖片,這是部署在我們CDN上。每臺機器普通64位Linux系統(tǒng),安裝是阿帕奇,沒有用5.3,因為我們一些擴展可能也是歷史原因,一些擴展目前還不能遷移到5.3上,這也是我們接下來要做的工作。這個是放大搜索結(jié)果頁,大家可以看到圖上整個頁面大概分了幾個區(qū)域。最上面是搜索框,比如說有LOGO,有搜索框,再下面有一些導航條,中間這個區(qū)域我們把它叫做智能導航模塊,右側(cè)叫做掌柜推薦,大家可以理解為廣告。
這個其實是所有搜索結(jié)果頁基本都比較類似的,不管大家用Google也好,百度也好,或者其他MSN都非常類似,上面搜索框做搜索結(jié)果,右側(cè)是廣告。因為淘寶搜索頁大概有3到4屏,這頁主要是搜索相關(guān)一些篩選功能,比如上面看到有不同的篩選區(qū),下面有不同結(jié)果,只不過大家沒有特別留意。上面那個區(qū)我們叫做產(chǎn)品搜索區(qū)域,中間這個區(qū)域叫做商品搜索區(qū)域,在往下是其他一些文字鏈之類,最下面是翻頁。
有些細節(jié)大家可能不太好理解,打個比方。大家去Google搜索的時候,當你搜索北京天氣的時候,或者搜索北京奧運會的時候,搜索結(jié)果頁里面有非常多的內(nèi)容,比如有新聞的,有網(wǎng)頁,甚至還有論壇的。不同的來源,其實有不同的后端服務(wù)提供的,怎么樣在搜索結(jié)果頁里面把它展現(xiàn)出來,這其實就是一個問題,是我們問題和挑戰(zhàn)。
這里面有兩個核心問題,第一個來講,對于查詢應該展示哪些模塊,并不是每次搜索的時候都要出產(chǎn)品搜索結(jié)果。第二個問題,如果你要查詢多個模塊的時候,怎么樣保證高性能,讓用戶看到快速的搜索結(jié)果。試想一下,我們這個結(jié)果我們回到上一頁,這個頁面里面其實是要查非常多服務(wù),中間智能導航就是有很多服務(wù),下面有一個相關(guān)搜索模塊,包括右側(cè)廣告,和下一頁產(chǎn)品搜索結(jié)果,商品搜索結(jié)果,這樣算下來這個頁面要查5到6個業(yè)務(wù)模塊。
所以,怎么樣查詢多個模塊的時候,能夠保持高的性能,讓用戶快速看到搜索結(jié)果。帶著這些問題,我們來看一下它的架構(gòu)。這張架構(gòu)其實也是非常簡單圖,首先用戶可以進入我們一些入口程序,相當于搜索一個非常簡單的教研程序看看是不是合法和編碼。這些工作做完之后,會把用戶搜索詞,用戶搜索諾基亞,搜索涼鞋等等詞分配到解析,對于搜索來說理解用戶意圖非常重要,可以知道用戶想要找什么,要找的這個東西,應該在哪個內(nèi)幕下,或者有哪些屬性。
所以,我們會去調(diào)來這個模塊獲取用戶相關(guān)信息,查取相關(guān)內(nèi)容。我們知道核心一個問題,應該展示哪些模塊,同時對這個結(jié)果,應該怎么去展示。在這個時候,我們會去請求緩存模塊,因為像我們剛才講的一樣,他其實有5、6個后臺請求模塊,我們會去看看緩存有沒有命中,如果命中緩存問題就非常簡單,直接把這個數(shù)據(jù)從緩存拿出來一組裝,通過這個模板來做一切展示。
如果沒有命中緩存的話,我們會有一個專門檢索模塊,會根據(jù)你需要的數(shù)據(jù),必須你需要六個模塊,根據(jù)六個模塊去請求后臺一些服務(wù),在這里面是并發(fā)來做的,如何實現(xiàn)會在接下來講。所以,通過這樣一個架構(gòu),能夠?qū)崿F(xiàn)查詢內(nèi)容,以及能夠并發(fā)去獲取相關(guān)數(shù)據(jù)。接下來,講一下性能優(yōu)化,因為對搜索來講,性能方面是非常關(guān)注。
這張圖是09年Google合并的一些相關(guān)研究人員,他們通過一些實驗對比來發(fā)現(xiàn),性能對于搜索影響。當這個網(wǎng)站速度下降幾秒之后,他們會發(fā)現(xiàn)用戶點擊,用戶收入,相關(guān)廣告收入,用戶的滿意度都會有非常明顯下降。其實,性能來講,這個話題這幾年也變的逐漸非常熱門起來,不管是從06年雅虎提出一些相關(guān)APP Store,或者前端優(yōu)化十幾跳軍規(guī),一直到去年這里面領(lǐng)軍人物史蒂夫提出一個WTO概念,做性能優(yōu)化已經(jīng)可以做成一個產(chǎn)業(yè)。
所以,更好性能意味著更低的成本,更高收入,以及更好的用戶體驗。所以,我們在性能優(yōu)化方面也做了非常多的工作。這些工作整理起來,我們可以把它歸納為性能規(guī)劃CPP的原則,第一條就是Cache,緩存。做這種網(wǎng)站緩存非常重要,甚至有時候是非常關(guān)鍵一點。緩存我們通常使用兩個方式,第一就是APC,如果大家做PHP可能對APC都比較了解。第二點就是Memcached,我們使用了一些緩存。
再下面一點就是并發(fā),PHP并沒有多線程概念。這里面我們利用一些技術(shù),可以并發(fā)去訪問后臺一些接口。第三點就是預期,其實做性能也好,類似于優(yōu)化也好,有時候你不能達到足夠快,至少也要讓這個網(wǎng)站看上去比較快,我們把它叫做預期。其實簡單做法,讓這個網(wǎng)站能夠支持這種類似于分化輸出,當用戶搜索完了之后,你可以讓你的網(wǎng)站,搜索框先出來,再去查后臺模塊,最后在展示最下面的內(nèi)容。
這張圖就是關(guān)于Cache一個介紹,比如APC。提供一些APC類似于Opcode的軟件也好,我們選擇的是APC。從這張圖上可以看到,使用APC以后,能夠大幅優(yōu)化PHP代碼解釋時間,我們之前也做過一些性能對比,用過APC之后能夠把性能提升25%-40%左右。對于APC還有很深入話題,比如APC里面有一些參數(shù),有興趣的同學可以上網(wǎng)查一下,也可以跟我交流。
這張圖是一個Memcached的事例,基本原理就是Check,Miss,Store,Check是第一步,當你最開始訪問這個模塊是沒有,如果開始沒有,就會去到后臺計算相關(guān)數(shù)據(jù),比如去查數(shù)據(jù)庫,去請求遠程接口。當拿到結(jié)果之后,會把這個數(shù)據(jù)存儲到Cache里面去,并且把這個結(jié)果反映給輸出,你第二次來的時候就命中Cache,所以Cache直接輸出結(jié)果了。
對于Memcached來講是一個非常成熟技術(shù),我們用Memcached大概有幾十臺機器,每臺機器開了幾個G來做,大概有幾百個G,是一個獨立的Cache集群。因為我們是多個模塊,當你去請求Cache,可以查一下有沒有命中,如果沒有命中可以請求后臺,你可以一次性向Memcached發(fā)請求,一次性把請求發(fā)過去看有沒有命中,他會告訴你有幾個模塊命中有幾個模塊沒有命中,我們在去查后端,可以減少Memcached的請求。
下面和大家分享一下并發(fā),PHP其實不支持多線程。如果說要串行訪問多個后臺缺口會非常嚴重影響性能,做一個簡單計算,剛才所講一樣,如果有5個后臺模塊。每個模塊訪問需要50毫秒,5×5就是250毫秒,對做搜索來講其實是非常慢了。所以,如果串行訪問后臺接口會非常慢。我們解決方案是使用CURL和Multi功能,下面列了一些相關(guān)函數(shù),大家可以在下面去查查手冊可以看一下,這里面還有更詳細的一個文章來介紹。
基本原理利用提供封裝功能一次性把請求發(fā)出去,等著響應拿到結(jié)果進行處理。按照優(yōu)化原則,80%優(yōu)化都集中在前端。前端我們做了一些嘗試,比如我們了CDN Combo,合并HTTP請求。比如我們這個頁面需要用5個頁面表,我們可以對請求進行合并,減少請求優(yōu)化性能。同時,按照最常規(guī)做法就是壓縮CSS/JS文件,壓縮完之后尺寸可以大大減少,提高加載速度。
還有一些做法,我們在首頁預先加載結(jié)果頁所需部分文件,用戶要做的事情通常是搜索。在首頁可以預先加載所需要的CSS和JS文件,在首頁進行一個平衡,據(jù)我了解Google很多網(wǎng)站都是這么做的。還有圖片的Lazy-Load,相當于業(yè)界一個標準做法,像搜索結(jié)果頁大概有40張圖片,大多數(shù)情況下來講,用戶可能只會看前面幾張圖片,如果滿意就點走了,如果不滿意會做一些搜索和其他篩選。接下來你屏幕以下非常多的圖片就有點浪費了,如果用戶不看的話,所以我們就采用Lazy-Load,當用戶滾屏的時候可以大幅度提高性能,降低帶寬。
接下來給大家講一下監(jiān)控報警,每天幾百臺機器監(jiān)控報警也是非常重要的。這張圖是截取在我們公司里面一個哈勃監(jiān)控系統(tǒng),我們通常統(tǒng)計了命中率,統(tǒng)計了一些數(shù)據(jù)在這里面進行分析,具體實現(xiàn)大概是這樣的。我們的程序是有日志,比如有統(tǒng)計PV,超時數(shù)據(jù),如果一旦訪問后臺結(jié)果超時的時候會在日志里面做記錄。還有Latency,如果發(fā)現(xiàn)一些問題,我們定一些規(guī)則,比如超時時數(shù)達到多少,或者PV變化,就會發(fā)短信進行報警。
同時,我們剛才講了我們有非常多的memcached-top來作為緩存,所以我們使用memcached腳本監(jiān)控memcached集群運行情況。我們使用xhprof采樣獲得線上程序運行情況,有點類似與PHP。由于時間關(guān)系,今天我要講的內(nèi)容基本上就這些,其實淘寶搜索他的內(nèi)容非常多,剛才也只是講到一些點,感興趣的同學可以會后跟我聯(lián)系。我們也在招一些PHP工程師,我們也非常希望大家能夠加入我們,和我們一起來做下一代的淘寶搜索。我的聯(lián)系方式是jiansu@taobao.com,還可以訪問我們的微博,感謝大家。
總結(jié)
以上是生活随笔為你收集整理的淘宝李晓拴:淘宝网PHP电子商务应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性签名霸气的
- 下一篇: 原神天幕影打刀怎么获得?