《淘寶技術(shù)這十年》的分析與總結(jié):創(chuàng)造技術(shù)里程碑
| 延伸閱讀:《淘寶技術(shù)這十年》專(zhuān)題 |
一、淘寶的核心技術(shù)(國(guó)內(nèi)乃至國(guó)際的Top,這還是2011年的數(shù)據(jù))
- 擁有全國(guó)***的分布式Hadoop集群(云梯,2000左右節(jié)點(diǎn),24000核CPU,48000GB內(nèi)存,40PB存儲(chǔ)容量)
- 全國(guó)分布80+CDN節(jié)點(diǎn),能夠自動(dòng)找尋最近的節(jié)點(diǎn)提供服務(wù),支持流量超過(guò)800Gbps,足以拖垮一個(gè)城市的流量
- 不遜于百度的搜索引擎,對(duì)數(shù)十億商品進(jìn)行搜索,全球***的電商平臺(tái)
- ***的負(fù)載均衡系統(tǒng),***的分布式系統(tǒng),***的互聯(lián)網(wǎng)思想,功能多樣運(yùn)行極其穩(wěn)定
- 豐富的生態(tài)產(chǎn)業(yè)以及先進(jìn)的數(shù)據(jù)挖掘技術(shù)
- ......很多很多
二、淘寶網(wǎng)的誕生
馬總在2003年4月7日秘密叫來(lái)阿里巴巴的十位員工,來(lái)到杭州一個(gè)隱秘的毛坯房,要求他們?cè)谝粋€(gè)月左右的時(shí)間內(nèi)做出一個(gè)C2C網(wǎng)站。
結(jié)果當(dāng)然還是直接買(mǎi)的快,一個(gè)基于LAMP架構(gòu)的網(wǎng)站,原名是PHPAuction,老美開(kāi)發(fā)的一個(gè)拍賣(mài)網(wǎng)站。當(dāng)然必須要做修改才能用。(作為一個(gè)曾經(jīng)用老美開(kāi)發(fā)的前端頁(yè)面開(kāi)發(fā)自己博客的同學(xué),確實(shí)感覺(jué)用別人寫(xiě)的比較方便偷懶-_-,不過(guò)我確信虛竹、三豐、多隆等前輩是有足夠?qū)嵙﹂_(kāi)發(fā)自己網(wǎng)站的——還是馬總催的緊)
當(dāng)時(shí)財(cái)大氣粗的eBay正在中國(guó)耀武揚(yáng)威,加上SARS肆虐,可能大家對(duì)網(wǎng)購(gòu)產(chǎn)生了新的認(rèn)識(shí)。而淘寶刻意保持低調(diào),甚至連阿里的員工都不知道這是他們自己公司的產(chǎn)品。
淘寶的員工積極回答著用戶的問(wèn)題,早起貪黑,鍛煉身體的方法就是倒立。
淘寶的功能也在不斷的完善著,發(fā)布、管理、搜索、詳情、購(gòu)買(mǎi)等等,服務(wù)器也變成了三臺(tái)。因?yàn)閿?shù)據(jù)量大了,淘寶的搜索很慢(使用LIKE匹配...),多隆前輩把阿里巴巴的搜索引擎iSearch搬了過(guò)來(lái)。
當(dāng)時(shí)MySQL的默認(rèn)存儲(chǔ)引擎MyISAM會(huì)導(dǎo)致讀寫(xiě)鎖等待時(shí)間過(guò)長(zhǎng)等等大量問(wèn)題,所以意外還是很多的。
2003年底,淘寶注冊(cè)用戶23萬(wàn),PV 31萬(wàn)/day,半年成交額3371萬(wàn)。
三、淘寶的更新
很顯然MySQL無(wú)法撐得起如此大的訪問(wèn)量,數(shù)據(jù)庫(kù)瓶頸出現(xiàn)了。幸好阿里的DBA隊(duì)伍足夠強(qiáng)大,他們使用Oracle替代了MySQL。
Oracle那時(shí)就已經(jīng)有了強(qiáng)大的并發(fā)性訪問(wèn)設(shè)計(jì)——連接池,從連接池取連接的耗費(fèi)比單獨(dú)建立連接少很多。但是PHP當(dāng)時(shí)并沒(méi)有官方提供支持語(yǔ)言連接池特性,于是多隆前輩用Google(不會(huì)是Baidu)搜到了一個(gè)開(kāi)源的SQL Relay,于是數(shù)據(jù)庫(kù)軟件方面的瓶頸暫時(shí)解決了。
但是硬件容量不夠了,阿里買(mǎi)了NAS(后來(lái)因?yàn)檠舆t嚴(yán)重原因買(mǎi)了EMC的SAN低端存儲(chǔ)),加上Oracle高性能RAC,硬件容量也暫時(shí)沒(méi)問(wèn)題了。
開(kāi)源的東西固然好,但是大膽使用也是一次嘗試的過(guò)程,SQL Relay會(huì)頻繁的導(dǎo)致死鎖問(wèn)題,導(dǎo)致工程師不得不定期進(jìn)行重啟服務(wù),從書(shū)中的描述可以看出,淘寶的工程師們真的非常辛苦。
淘寶網(wǎng)不會(huì)止步于僅僅為賣(mài)家和買(mǎi)家提供一個(gè)交易的網(wǎng)站而已,還需要建立一個(gè)完善的第三方體系,來(lái)保證賣(mài)家和買(mǎi)家之間的交易是安全的,于是支付寶誕生了。比較麻煩的是,當(dāng)時(shí)雖有很多銀行開(kāi)放了網(wǎng)銀接口,但是甚至不能保證付錢(qián)后就會(huì)扣款成功,還是需要工程師們辛苦的一板一眼去對(duì)賬......
淘寶為了便于用戶的交流,開(kāi)發(fā)了一個(gè)IM軟件——旺旺,不僅給買(mǎi)賣(mài)雙方使用,阿里內(nèi)部也使用旺旺交流。
四、***個(gè)里程碑
因?yàn)镾QL Relay的問(wèn)題實(shí)在過(guò)于嚴(yán)重,2004年于是淘寶終于做出了跨時(shí)代的決策——使用Java重寫(xiě)網(wǎng)站(鼓掌~~~)。
沒(méi)錯(cuò),淘寶請(qǐng)了Sun的高級(jí)工程師來(lái)幫忙做Java架構(gòu)。那么他們是如何做到修改編程語(yǔ)言而不改變網(wǎng)站使用呢——模塊化替換,今天寫(xiě)好了A模塊,另開(kāi)一個(gè)新域名,將連接指向該模塊,同時(shí)別的模塊不變,等到全部模塊完成的時(shí)候,原域名放棄。
使用的框架:淘寶的架構(gòu)師在Jakarta Turbine的基礎(chǔ)上開(kāi)發(fā)了自己的MVC框架——WebX。而Sun公司堅(jiān)持使用EJB作為控制層(估計(jì)當(dāng)時(shí)只有他們才能玩貫EJB),加上使用iBatis作為持久層,一個(gè)可擴(kuò)展且高效的Java EE應(yīng)用誕生了。BYW,支付寶也是Sun的工程師用同樣的架構(gòu)設(shè)計(jì)的。
送走Sun的大牛們之后,阿里的數(shù)據(jù)存儲(chǔ)又遇到了瓶頸,于是忍痛買(mǎi)了一臺(tái)IBM小型機(jī)(我猜至少是***別的.......),也就有了IOE(IBM + Oracle + EMC)這樣的傳說(shuō)。
2004年底,淘寶注冊(cè)用戶400萬(wàn),PV 4000萬(wàn)/day,全網(wǎng)成交額10個(gè)億。
五、再接再厲
Oracle也有處理上限,當(dāng)數(shù)量的級(jí)別是“億”的時(shí)候,就不是一個(gè)Oracle服務(wù)器支撐的起的了。DBA們把數(shù)據(jù)分到了兩個(gè)數(shù)據(jù)庫(kù)中,通過(guò)ID的***位決定查詢哪一個(gè)數(shù)據(jù)。比如,‘0’至‘7’放在A數(shù)據(jù)庫(kù),‘8’至‘f’放在B數(shù)據(jù)庫(kù),通用信息放在C數(shù)據(jù)庫(kù)。但是如何既查詢'3'開(kāi)頭又查詢'e'開(kāi)頭的數(shù)據(jù)呢?一個(gè)數(shù)據(jù)庫(kù)路由框架DBRoute由架構(gòu)師行癲編寫(xiě),統(tǒng)一處理合并問(wèn)題而對(duì)上層透明。
Spring誕生了,早聞Spring框架在Web應(yīng)用不可或缺,而在淘寶網(wǎng),Spring也達(dá)到了Rod Johnson設(shè)計(jì)它的目的——替代EJB。
2005年底,淘寶注冊(cè)用戶1390萬(wàn),PV 8931萬(wàn)/day,商品數(shù)目1663萬(wàn)個(gè)。
說(shuō)實(shí)話我真的好佩服,這么大的訪問(wèn)量都能如此堅(jiān)挺,但是,考慮到未來(lái)的發(fā)展,這樣的設(shè)施架構(gòu)只是勉強(qiáng)可以應(yīng)付現(xiàn)在的要求。于是,CDN技術(shù)派上用場(chǎng)了,一開(kāi)始使用商用的ChinaCache,后來(lái)使用章文嵩博士搭建低耗能CDN網(wǎng)絡(luò),淘寶網(wǎng)的性能越來(lái)越好了。
2006年底,淘寶注冊(cè)用戶3000萬(wàn),PV 15000萬(wàn)/day,商品數(shù)目5000萬(wàn),全網(wǎng)成交額169億元。
六、創(chuàng)造技術(shù)
為了考慮交易的公平性,淘寶增加了交易快照功能,將當(dāng)前交易網(wǎng)頁(yè)以圖片的形式保存下來(lái),淘寶的交易量如此之大,帶來(lái)了一個(gè)問(wèn)題——碎片圖片過(guò)多,2010年,淘寶網(wǎng)的后端上保存著286億張圖片。
淘寶在2007年之前,使用NetApp的商用存儲(chǔ)系統(tǒng),但是仍然不夠應(yīng)付迅速增長(zhǎng)的趨勢(shì)。同年Google公布了GFS的設(shè)計(jì)思想,參照它的思想,淘寶也開(kāi)發(fā)了自己的文件系統(tǒng)——TFS。至于這個(gè)文件系統(tǒng)的具體原理書(shū)上給的并不詳細(xì)(應(yīng)該是我看不懂-_-),不過(guò)可以大概可以了解是專(zhuān)門(mén)為大量的圖片設(shè)計(jì)的,從每個(gè)用戶1張圖片到TFS上線后5張?jiān)俚?GB的圖片空間,這些都得益于TFS集群的文件存儲(chǔ)系統(tǒng)以及大量的圖片服務(wù)器。淘寶使用實(shí)時(shí)生成縮率圖,全局負(fù)載均衡以及一級(jí)和二級(jí)緩存來(lái)保證圖片的訪問(wèn)優(yōu)化與高效訪問(wèn)。
淘寶的服務(wù)器軟件使用Tengine,一個(gè)被優(yōu)化過(guò)的nginx模塊。
淘寶也做過(guò)失敗的產(chǎn)品,不是因?yàn)榧夹g(shù)原因而是市場(chǎng)原因。首先是“團(tuán)購(gòu)”,失敗在于人心叵測(cè)。再次是“我的淘寶”,使用了風(fēng)靡全球的AJAX的技術(shù),但是做的過(guò)于AJAX了,可能是太不容易上手了(馬總親口說(shuō)的),還有“招財(cái)進(jìn)寶”(被競(jìng)爭(zhēng)對(duì)手認(rèn)為是破壞了“免費(fèi)”的承諾而大肆宣揚(yáng))。
記錄商品的訪問(wèn)量,使用傳統(tǒng)的數(shù)據(jù)庫(kù)I/O實(shí)在過(guò)于影響效率,所以淘寶使用了緩沖的技術(shù),先是使用ESI(Edge Side Includes),解決了片段緩沖問(wèn)題。因?yàn)橛行┐蟮赇佋L問(wèn)量過(guò)大,頻繁的I/O實(shí)在得不償失,于是多隆前輩寫(xiě)出了TBstore,可以緩存大量的數(shù)據(jù),核心思想是使用Hash算法快速尋找。其核心是基于Berkeley DB,一種類(lèi)內(nèi)存數(shù)據(jù)庫(kù),導(dǎo)致的問(wèn)題是內(nèi)存數(shù)據(jù)量大了還是會(huì)刷到磁盤(pán)中,因此性能并不是那么的好。
后來(lái),淘寶分離出了UIC(User Information Center),供所有模塊調(diào)用。多隆前輩再次為其編寫(xiě)出了TDBM,完全是基于內(nèi)存的數(shù)據(jù)緩存(參考了memcached)。再然后,淘寶將TBstore和TDBM合并,寫(xiě)出了Tair,一個(gè)基于Key-Value的分布式緩存數(shù)據(jù)系統(tǒng)。然后升級(jí)了自己的iSearch系統(tǒng)。
2007年底,淘寶注冊(cè)用戶5000萬(wàn),PV 25000萬(wàn)/day,商品數(shù)目1個(gè)億,全網(wǎng)成交額433億元。
七、更多的技術(shù)
一個(gè)電子商務(wù)平臺(tái)不可缺少的細(xì)節(jié)——商品類(lèi)目的處理。因?yàn)樯唐返念?lèi)目實(shí)在過(guò)于龐大,因此如何根據(jù)類(lèi)目劃分商品成為了難題。機(jī)智的一燈前輩說(shuō),這些屬性可以當(dāng)做標(biāo)簽,直接“貼”在商品上(應(yīng)該是這樣的吧)。
2008年,淘寶將支付寶單獨(dú)分離出來(lái)。其中交易的底層業(yè)務(wù)叫交易中心TC(Trade Center),涉及訂單之類(lèi)的原子操作。交易的上層業(yè)務(wù)叫做交易管理TM(Trade Manager),不涉及對(duì)物流的操作。
于是,應(yīng)運(yùn)而生的,第二個(gè)堪稱里程碑的項(xiàng)目——系統(tǒng)拆分 誕生了。這個(gè)正是我們?cè)诎⒗飯A桌會(huì)議上HR所說(shuō)一位元老級(jí)員工做的——“給一架高速飛行的飛機(jī)換發(fā)動(dòng)機(jī)”這么驚險(xiǎn)的重構(gòu)任務(wù)。這些組件分割難度非常之大,以至于那張復(fù)雜的邏輯圖我實(shí)在看不懂......總之,淘寶中間件誕生了。
HSF(高性能服務(wù)框架):核心,外號(hào)好舒服。請(qǐng)參見(jiàn)作者的博文http://www.blogjava.net/BlueDavy/archive/2008/01/24/177533.html
Notify(消息中間件):淘寶自主開(kāi)發(fā)的消息隊(duì)列產(chǎn)品。支撐了10億+的消息通知。
TDDL(分布式數(shù)據(jù)訪問(wèn)層):優(yōu)化了DBRoute,在JDBC和DB之間隔了一層,負(fù)責(zé)數(shù)據(jù)庫(kù)的優(yōu)化工作。
Tbsession:因?yàn)镾ession保存在服務(wù)器中,但是用戶可能會(huì)被動(dòng)的頻繁的切換服務(wù)器,淘寶的設(shè)計(jì)思路是將Session信息保存在Cookie中,***使用Tair來(lái)保存。
阿里的開(kāi)放平臺(tái)也相當(dāng)有歷史,有興趣的可以參觀參觀http://open.taobao.com/index.htm
八、總結(jié)
當(dāng)你處于業(yè)界中流時(shí),你可以向老大學(xué)習(xí),等當(dāng)你成為業(yè)界老大之后,你就需要不斷超越自己,用自己的力量來(lái)改變整個(gè)行業(yè),乃至整個(gè)世界。無(wú)論是華為,還是阿里,當(dāng)成為業(yè)內(nèi)的Top時(shí),責(zé)任反而更加重大。
一直覺(jué)得自己想著隨大流,但是卻又心有不甘。如今有機(jī)會(huì)能進(jìn)入全中國(guó)***的互聯(lián)網(wǎng)網(wǎng)站,一直為自己這些年的付出感到榮幸,同時(shí)不斷勉勵(lì)自己,你需要變得更強(qiáng)才能融入這個(gè)集體。
任重而道遠(yuǎn),縱望阿里淘寶這些年的發(fā)展之路,那些默默無(wú)聞卻勇于探索鉆研的人是最可愛(ài)的,遇到問(wèn)題永遠(yuǎn)不服輸,總會(huì)有辦法去解決的。正如阿里圓桌會(huì)議HR所說(shuō)的“在座的各位都是愛(ài)折騰的人”,我承認(rèn)自己受之有愧,自己的身體一直不能保證毫無(wú)顧忌的拼斗,自己雖然每天堅(jiān)持都去跑步,底子還是不行,想要成為一名武林中人,更漫長(zhǎng)的路需要我堅(jiān)持的走下去,意志力,我可以有。
堅(jiān)持學(xué)習(xí),鉆研學(xué)習(xí),實(shí)踐學(xué)習(xí)。希望自己能堅(jiān)持這三點(diǎn)信條。
相當(dāng)佩服馬總的思想理念和為人處事,也相當(dāng)佩服那么多實(shí)力不凡而又忠心耿耿的部下,他們對(duì)得起他們的身價(jià)。
子柳兄的《淘寶技術(shù)這十年》到此總結(jié)完畢,我相信淘寶的光輝路程的還有很長(zhǎng),我的學(xué)問(wèn)之路,也必將一直走下去。





















