幾年以來,eBay在幾個(gè)不同的大會上先后分享過幾次關(guān)于eBay技術(shù)的PPT,在這篇blog中,就以這些PPT來以旁觀者的角度分析下eBay的技術(shù)發(fā)展歷程,不論eBay現(xiàn)在的業(yè)績?nèi)绾?,不可否認(rèn),他們的技術(shù)還是挺強(qiáng)的,因此還是值得學(xué)習(xí),eBay的整個(gè)技術(shù)發(fā)展歷程從一定程度上來說可以認(rèn)為是互聯(lián)網(wǎng)公司的典型技術(shù)發(fā)展歷程,基本上各家互聯(lián)網(wǎng)公司都在走著類似的路線,只是各家選擇的語言不同、具體的實(shí)現(xiàn)方案不同、細(xì)節(jié)不同,當(dāng)然,思路是一方面,實(shí)現(xiàn)又是另外一方面,只有兩者結(jié)合才能實(shí)現(xiàn)一個(gè)高可用、高性能和高并發(fā)的有海量數(shù)據(jù)的系統(tǒng)。
本篇blog中涉及到的主要有eBay的以下三個(gè)PPT,先來闡述下這幾個(gè)PPT,最后從一個(gè)旁觀者的角度來總結(jié)下eBay的技術(shù)發(fā)展。
ps: 以下提及的三個(gè)PPT均可在此下載:
http://m.tkk7.com/BlueDavy/archive/2009/04/28/267970.html
1、The eBay Architecture 2006
這個(gè)PPT非常經(jīng)典,闡述了eBay從成立之初到2006年所經(jīng)歷的技術(shù)發(fā)展歷程,這個(gè)過程一定程度上也是目前大多數(shù)網(wǎng)站從小到大時(shí)的一個(gè)發(fā)展過程。
在這個(gè)PPT中,eBay首先根據(jù)自己的經(jīng)驗(yàn),總結(jié)出了一些經(jīng)驗(yàn),這些經(jīng)驗(yàn)包括:
(1). 每一層都要支持水平伸縮,按功能劃分;
(2). 優(yōu)選異步方式為系統(tǒng)間交互的方式;
(3). 減少系統(tǒng)間物理依賴以及提升部署的靈活性;
(4). 自動化的錯(cuò)誤診斷和通知,業(yè)務(wù)功能的降級支持。
即使現(xiàn)在看這些經(jīng)驗(yàn),可謂是金玉良言,想必eBay也是在一個(gè)快速發(fā)展的過程經(jīng)歷了很多次血的教訓(xùn)才得到上面這些經(jīng)驗(yàn)的。
在總結(jié)完經(jīng)驗(yàn)后,PPT開始詳細(xì)的闡述eBay從1995--2006的技術(shù)發(fā)展歷程,從V 1.0到V 2.x,首先是將系統(tǒng)重構(gòu)為3層結(jié)構(gòu),采用Oracle,業(yè)務(wù)服務(wù)器和數(shù)據(jù)庫服務(wù)器分開,采用索引,這也就是2.0版本;進(jìn)入2.1版本后,想必是數(shù)據(jù)庫壓力開始增大了,這有兩方面原因,一是訪問量的上漲,二是數(shù)據(jù)量的上漲,因此將數(shù)據(jù)庫服務(wù)器進(jìn)行了升級,換成了更好的服務(wù)器,同時(shí)給前端加上了負(fù)載均衡,這應(yīng)該是為了前端應(yīng)用更簡單的實(shí)現(xiàn)水平擴(kuò)展;進(jìn)入2.3版本后,增加了第二臺數(shù)據(jù)庫服務(wù)器,以支持failover,提升可用性,同時(shí)其他的業(yè)務(wù)服務(wù)器在不斷的增加中,到2.3版本運(yùn)行的末階段,數(shù)據(jù)庫服務(wù)器已經(jīng)達(dá)到了運(yùn)行的極限;進(jìn)入2.4版本階段,專注解決數(shù)據(jù)庫壓力的問題,采用的方案為將數(shù)據(jù)庫邏輯分區(qū)為多個(gè)實(shí)例;進(jìn)入2.5版本階段,開始進(jìn)行水平分表,例如按類目將商品分解到多張表中,或者讀寫分等。在V 2.5階段完成后,此時(shí)數(shù)據(jù)庫部分壓力的問題基本解決,但在eBay面前又出現(xiàn)了新的問題(畫外音:所以說互聯(lián)網(wǎng)公司到最后技術(shù)的比拼也非常重要),幾百人維護(hù)同樣的代碼,甚至還達(dá)到了類允許的最大的方法數(shù)等問題,于是進(jìn)入了eBay架構(gòu)的V 3時(shí)代。V 3最重要的是將整個(gè)應(yīng)用翻寫為Java,并提升了代碼的重用性和代碼的職責(zé)分離,同時(shí)為開發(fā)人員提供了一個(gè)開發(fā)的框架(應(yīng)該就是那篇著名的eclipse at eBay)。
在PPT的最后,eBay又詳細(xì)的分享了他們對于構(gòu)建可伸縮系統(tǒng)的一些經(jīng)驗(yàn),這些經(jīng)驗(yàn)對多數(shù)人而言都會非常的有幫助,來看看。
(1). 數(shù)據(jù)層的伸縮
主要是三種方法:分解壓力,減少數(shù)據(jù)庫做的事情,無事務(wù)等技巧。
分解壓力最主要的方法有按功能進(jìn)行劃分,功能范圍內(nèi)的則可進(jìn)行水平劃分,在PPT中eBay還分享了下按功能劃分的一些例子,例如按用戶、商品、評價(jià)等,水平劃分方面同樣列舉了一些例子,例如讀寫分、hash分等。
對于數(shù)據(jù)層的伸縮,eBay在PPT中提到了非常關(guān)鍵的一點(diǎn),那就是應(yīng)用無需關(guān)心分庫、分表這些,這樣的話,無論是要分庫、合庫、分表還是合表,對應(yīng)用都是完全透明的,正是因?yàn)檫@個(gè)理念造就了eBay很早以前就擁有了令人驕傲的數(shù)據(jù)層,也就是DAL。
減少數(shù)據(jù)庫做的事情最主要的方法是不要在數(shù)據(jù)庫中做業(yè)務(wù)邏輯的處理,將耗CPU的操作(包括joins、sorting等)放到應(yīng)用中完成,使用Prepared statements和綁定變量。
所謂的無事務(wù)等技巧是指沒有分布式事務(wù),而改為采用補(bǔ)償?shù)确绞饺ケ3謹(jǐn)?shù)據(jù)一致性。
(2). 應(yīng)用層的伸縮
主要也是三種方法:分解壓力,減少依賴和虛擬的數(shù)據(jù)操作。
分解壓力最主要的方法有按功能劃分,水平則借助負(fù)載均衡來進(jìn)行伸縮,關(guān)于這里面的具體的一些技巧,PPT中提到了應(yīng)拋棄大部分Java EE的東西,保持應(yīng)用層的無狀態(tài),盡可能的使用緩存。
減少依賴最主要的方法有將代碼也按功能進(jìn)行劃分,各功能之間需要共享的東西則放入domain中,所有的應(yīng)用都只能依賴domain,不能依賴其他的應(yīng)用,而domain之間也不能有依賴,另外PPT中還提及到的有平臺解耦,對于這點(diǎn)eBay的做法是經(jīng)典的EDA以及同步的SOA。
虛擬的數(shù)據(jù)操作指的就是(1)中提及到的數(shù)據(jù)層了,不過在這里還值得注意的是它有提到它們可以做到從數(shù)據(jù)路由方面來達(dá)到優(yōu)雅降級,所謂優(yōu)雅降級的概念就是當(dāng)系統(tǒng)壓力大時(shí),只保核心功能可用,而其他非核心的功能則不可用。
(3).搜索的伸縮
對這部分不是很感興趣,大概提下主要就是做了實(shí)時(shí)索引,水平劃分以及緩存。
(4).操作的伸縮
eBay在當(dāng)時(shí)就能考慮這塊,真的很不容易,這里包含的主要是兩點(diǎn):代碼部署以及監(jiān)測。
由于當(dāng)時(shí)的eBay基本每兩星期就要做全站部署,不過現(xiàn)在的eBay已經(jīng)不會這么頻繁部署了,部署時(shí)的依賴關(guān)系、部署后失敗的回滾操作、眾多的配置以及需要部署到眾多的機(jī)器,這些都煩惱著當(dāng)時(shí)的eBay,因此eBay做了一個(gè)部署系統(tǒng),該部署系統(tǒng)可做到的是根據(jù)需要的部署的功能,分析出其依賴關(guān)系,按依賴關(guān)系進(jìn)行部署,部署時(shí)自動進(jìn)行檢測和校驗(yàn),并可選擇性的進(jìn)行回滾或全部回滾,不得不感嘆,真夠強(qiáng)大的。
監(jiān)測方面基于消息機(jī)制實(shí)現(xiàn),對日志進(jìn)行廣播、記錄(記錄至文件(當(dāng)時(shí)的eBay記錄的操作日志文件就已經(jīng)有1.5TB每天了)、捕捉異常進(jìn)行告警或?qū)崟r(shí)的系統(tǒng)狀態(tài)的監(jiān)測)以及分析(報(bào)表、挖掘等)。
從上面的對PPT的分析來看,盡管這個(gè)PPT并不厚,但它的價(jià)值真的非常的高,并且也充分的展現(xiàn)了eBay的技術(shù)實(shí)力。
2、eBay Architectural Principles 2008
在2008年的QCon London會議上,eBay分享了這個(gè)PPT,這個(gè)PPT的內(nèi)容不像上面的PPT講解eBay的架構(gòu)演變過程,而是直接根據(jù)eBay的經(jīng)驗(yàn)總結(jié)了一些構(gòu)建大型可伸縮系統(tǒng)的架構(gòu)原則,有點(diǎn)像設(shè)計(jì)模式,將之前應(yīng)對場景需求的一些技巧都總結(jié)成了模式,因此這些原則對于構(gòu)建大型系統(tǒng)的同學(xué)而言都非常有幫助,來具體的看看。
PPT首先提到了架構(gòu)關(guān)注的重點(diǎn):可伸縮性、可用性、延時(shí)、可管理性以及成本,然后就提交到四點(diǎn)架構(gòu)模式,來具體看看。
(1). 能分則分
在這點(diǎn)上eBay提出了一個(gè)觀點(diǎn):"If you can't split it,you can't scale it",因此eBay建議將系統(tǒng)按數(shù)據(jù)、壓力或使用情況來進(jìn)行分解,分解的模式為按功能以及水平拆分。
在PPT中eBay繼續(xù)提及了數(shù)據(jù)庫的垂直以及水平拆分方法、無事務(wù)、應(yīng)用層的垂直以及水平拆分方法、應(yīng)用層的無狀態(tài)、搜索的垂直以及水平拆分,這些方法在第一個(gè)PPT中也有詳細(xì)分享。
(2). 能異步則異步
在這點(diǎn)上,eBay認(rèn)為,只要能異步就應(yīng)該異步,異步的實(shí)現(xiàn)模式為消息機(jī)制以及定時(shí)批量操作機(jī)制。
消息機(jī)制的方式通常為功能核心部分完成后發(fā)出消息,然后訂閱消息的應(yīng)用異步的進(jìn)行一些處理,例如創(chuàng)建商品在創(chuàng)建完畢后,發(fā)出消息,圖像處理的應(yīng)用在接到消息后則能對此商品進(jìn)行相應(yīng)的處理,在PPT中還舉到的一個(gè)例子為發(fā)出消息,用于更新搜索中的索引信息,這其實(shí)也就是eBay的實(shí)時(shí)索引的實(shí)現(xiàn)方式了。
定時(shí)批量操作適用于導(dǎo)入三方數(shù)據(jù)、生成推薦等。
(3). 能自動化則自動化
在這點(diǎn)上,eBay認(rèn)為,能自動化的就盡量自動化,避免人工操作,實(shí)現(xiàn)的模式為自適應(yīng)配置以及機(jī)器學(xué)習(xí)。
自適應(yīng)配置方面eBay舉了個(gè)例子,給一個(gè)事件的訂閱者定義了SLA,例如為99%的事件應(yīng)在15秒內(nèi)處理完,那么所謂的自適應(yīng)配置就是系統(tǒng)應(yīng)能根據(jù)配置的SLA自動的調(diào)整,以最小的資源去滿足SLA,例如調(diào)整處理的線程數(shù)、隊(duì)列的大小、彈出的頻率等,是不是有那么點(diǎn)云計(jì)算的前兆,:)。
機(jī)器學(xué)習(xí)方面eBay主要提及到的為給用戶提供最匹配的頁面布局、推薦等。
(4). 記住所有失敗的事
這里的需求是所有的系統(tǒng)都應(yīng)能容錯(cuò),主要目的是為了保證可用性,實(shí)現(xiàn)的模式為失敗檢測、回滾以及優(yōu)雅降級。
失敗檢測上eBay采取的方法為通過發(fā)送消息,由消息訂閱者來進(jìn)行記錄、告警、分析或挖掘。
在回滾方面主要指的是代碼的部署和回滾,就是之前第一個(gè)PPT中提及的部署系統(tǒng)。
優(yōu)雅降級指的是系統(tǒng)功能的動態(tài)打開和動態(tài)關(guān)閉,eBay采取的方法為一個(gè)集中的配置來管理功能的打開或關(guān)閉。
PPT中還舉了個(gè)例子來更好的說明,首先應(yīng)用檢測到了某個(gè)資源不可用或很慢,此時(shí)為了保證可用性,可做的有這么幾件事:應(yīng)用停止對此資源的操作并發(fā)出警告、關(guān)閉非核心的功能、核心功能退化(基于failover切換至其他資源或轉(zhuǎn)為異步處理模式)。
這個(gè)PPT同樣也不厚,但總結(jié)的非常好,這些模式對于構(gòu)建大型系統(tǒng)(尤其是互聯(lián)網(wǎng)系統(tǒng))而言基本都是必須的,在2009 QCon北京大會上,eBay分享的也是這方面的話題,大體都是相同的,因此就不再去分析那個(gè)PPT了。
3、Teaching Machines To Fish
在QCon San Francisco上,eBay分享了這個(gè)PPT,這個(gè)PPT重點(diǎn)在于分享了eBay的智能化方面的工作,包括智能的推薦、用戶請求的智能回答等,實(shí)現(xiàn)的策略方面主要是基于對用戶數(shù)據(jù)的收集和分析,這個(gè)部分由于主要是用戶數(shù)據(jù)分析的模型,在PPT中沒有做過多的介紹,但從PPT中也可以看出,eBay為了改進(jìn)搜索的效果付出了很大的努力,以盡可能的達(dá)到讓用戶最快的搜到自己想要的東西,這其實(shí)很難做到,例如同樣一個(gè)用戶搜索同樣一個(gè)單詞,期待的結(jié)果有可能是不同的。
eBay的這三個(gè)PPT都非常的經(jīng)典,不得不說,這種分享精神也是值得敬佩的,畢竟這都是eBay的發(fā)展歷程中摸索出來的,分享出來必然能讓很多碰到類似問題的網(wǎng)站少走很多的彎路,來說說我自己從旁觀者的角度看eBay的發(fā)展歷程。
從eBay的這幾個(gè)PPT來看,我覺得可以看出,eBay的技術(shù)其實(shí)在2006年就已經(jīng)基本成型,而其發(fā)展過程也可以看做是互聯(lián)網(wǎng)行業(yè)技術(shù)發(fā)展的一個(gè)縮影。
隨著訪問量的增長、數(shù)據(jù)量的增長以及功能的不斷增長,"分"基本成為了第一招救命招,而這招要做到其實(shí)不如想象中簡單,通常涉及到緩存技術(shù)、應(yīng)用的拆分、eBay提及的同步SOA和異步EDA、數(shù)據(jù)庫的拆分(分庫、分表)、文件存儲的拆分、負(fù)載均衡等,這些對技術(shù)的要求都很高,網(wǎng)站發(fā)展到了這一步后通常就逐步顯示出技術(shù)的重要性了。
eBay在進(jìn)行"分"的同時(shí)以及之后,在自動化以及可用性的提升方面也做出了很大的努力,這包括了部署系統(tǒng)、優(yōu)雅降級、監(jiān)測、系統(tǒng)容錯(cuò)、自適應(yīng)配置等的動作。
到了后面的階段,eBay開始投入了更多的精力在智能化的領(lǐng)域。
從上面這三個(gè)階段來看,可以認(rèn)為"分"-->自動化-->智能化是互聯(lián)網(wǎng)技術(shù)發(fā)展的一個(gè)常見發(fā)展模式,當(dāng)然,這其中涉及到了非常多的技術(shù),eBay的PPT確實(shí)為我們分享了很多這方面的技術(shù),而我同時(shí)覺得除了智能化以外,虛擬化或者云計(jì)算、節(jié)能技術(shù)也將成為后續(xù)互聯(lián)網(wǎng)技術(shù)的重點(diǎn),也許在后面各類大會上我們會更多的看到這方面的知識,當(dāng)然,目前也有一些在這方面領(lǐng)先的公司,例如Google、Amazon等。