淘寶升華:脫胎換骨的巨人
淘寶傳奇工程師多隆的程序世界
多隆是淘寶的創(chuàng)始人之一,也是淘寶的***個(gè)程序員,他奠定了諸多淘寶重大軟件項(xiàng)目的基礎(chǔ)。有人說他是淘寶的“掃地僧”,有人說他是“神”。在淘寶,他做到了既懂C/C++語言,又懂Java和內(nèi)核;既可以深入技術(shù)底層,又能切入到高層業(yè)務(wù)領(lǐng)域,從前端到后端,只是既光又深。他就是核心系統(tǒng)部專家組的多隆。
技術(shù)小兒中流傳一句話——“有困難,找多隆”。關(guān)于這點(diǎn),我深有體會(huì),又一次,我們組解決一個(gè)Apache服務(wù)器無故崩潰的詭異問題,搞了三天還是沒找出原因,于是請(qǐng)教多隆,他在三分鐘后就告訴了我答案。瞬間的秒殺,讓我領(lǐng)教了;高級(jí)研究員的威力。
我和多隆在同一個(gè)部門,工位相鄰。這個(gè)近水樓臺(tái)先得月的條件,讓我平時(shí)有很多機(jī)會(huì)觀察他,從他的一舉一動(dòng)中思索他如何以非科班出身(生物系生命科學(xué)專業(yè))成長為計(jì)算機(jī)牛人。
多隆說他的知識(shí)經(jīng)驗(yàn)的積累主要?dú)w功于在淘寶業(yè)務(wù)發(fā)展的過程中,他遇到了各種各樣的問題。這些問題促使他不斷學(xué)習(xí)解決問題的各種技術(shù),他和淘寶一起成長。在我看來,他對(duì)技術(shù)始終保持著謙卑的心態(tài)也很關(guān)鍵。他把自己當(dāng)成一塊海綿一樣去吸收新知識(shí)——在他的字典里,沒有不值得去解決的問題,也沒有不值得去學(xué)習(xí)的技術(shù)。而且每學(xué)一個(gè)知識(shí)點(diǎn),多隆都會(huì)寫一段代碼去驗(yàn)證,一方面是練習(xí),另一方面也讓他加深理解,直到真正掌握這個(gè)技術(shù)。
我的師父黃裳曾經(jīng)說過“好的架構(gòu)圖充滿美感”。一個(gè)架構(gòu)好不好,從審美的角度就能看出來。后來我看了很多系統(tǒng)的架構(gòu),發(fā)現(xiàn)這個(gè)言論基本成立。反觀淘寶以前兩個(gè)版本的架構(gòu),如下頁圖所示,你看哪個(gè)比較美?
顯然,***個(gè)比較好看,第二個(gè)顯得頭重腳輕,這也注定了它不是一個(gè)穩(wěn)定的版本,只存活了不到半年的時(shí)間。2004年初,SQL Relay的問題解決不了,數(shù)據(jù)庫必須要用Oracle,那么從哪里動(dòng)刀呢?只有換開發(fā)語言了。換什么語言好?用Java。Java是當(dāng)時(shí)最成熟的網(wǎng)站開發(fā)語言,它有比較良好的企業(yè)開發(fā)框架,被世界上主流的大規(guī)模網(wǎng)站普遍采用。另外,有Java開發(fā)經(jīng)驗(yàn)的人才也比較多,后續(xù)維護(hù)成本會(huì)比較低。
脫胎換骨的升級(jí)——更換開發(fā)語言
到2004年上半年,淘寶網(wǎng)已經(jīng)運(yùn)行了一年的時(shí)間,這一年積累了大量的用戶,也快速開發(fā)了很多功能,當(dāng)時(shí)這個(gè)網(wǎng)站已經(jīng)很龐大了,而且新的需求還在源源不斷地增加。把一個(gè)龐大的網(wǎng)站的開發(fā)語言換掉,無異于脫胎換骨,在換的過程中還不能拖慢業(yè)務(wù)的發(fā)展,這無異于邊換邊跑,對(duì)時(shí)間和技術(shù)能力要求都非常高。做這樣的手術(shù),需要請(qǐng)***流的專家來主刀?,F(xiàn)在再考一下。
大家:親,如果你在這個(gè)創(chuàng)業(yè)團(tuán)隊(duì)中,請(qǐng)什么樣的人來做這件事?我們的答案是請(qǐng)Sun公司的人。沒錯(cuò),就是創(chuàng)造Java語言的那家公司,世界上沒有比他們更懂Java的了。除此之外,還有一個(gè)不為人知的原因,我剛才說到Java被世界上主流的大規(guī)模網(wǎng)站普遍采用,其中有一個(gè)網(wǎng)站就是eBay,那時(shí)eBay的系統(tǒng)剛剛從C++改到而且就是請(qǐng)Sun的工程師給改造成Java架構(gòu)的,這下你懂了吧?他們不僅更懂Java,而且更懂eBay。Sun公司的這幫工程師的確很強(qiáng)大,在筆者2004年年底來淘寶的時(shí)候,他們還在,我有幸與他們共事了幾個(gè)月?,F(xiàn)在擺在他們面前的問題是用什么辦法把一個(gè)龐大的網(wǎng)站從PHP語言遷移到Java?而且要求在遷移的過程中,不停止服務(wù),原來系統(tǒng)的bugfix和功能改進(jìn)不受影響。親,你要是架構(gòu)師,你怎么做?有人的答案是寫一個(gè)翻譯器,如同把中文翻譯成英文一樣,自動(dòng)翻譯。我只能說你這個(gè)想法太超前了,“too young, too simple, sometimes naive”。當(dāng)時(shí)沒有,現(xiàn)在也沒有人能做到。他們的大致方案是給業(yè)務(wù)分模塊,一個(gè)模塊一個(gè)模塊地漸進(jìn)式替換。如用戶模塊,老的member.taobao.com繼續(xù)維護(hù),不添加新功能,新功能在新的模塊上開發(fā),跟老的模塊共用一個(gè)數(shù)據(jù)庫,開發(fā)完畢之后放到不同的應(yīng)用集群上,另開一個(gè)域名member1.taobao.com,同時(shí)再替換老的功能,替換一個(gè),就把老的模塊上的功能關(guān)閉一個(gè),逐漸把用戶引導(dǎo)到member1.taobao.com,等所有的功能都替換完之后,關(guān)閉member.taobao.com。從設(shè)計(jì)上來看,這個(gè)member1的二級(jí)域名應(yīng)該是一個(gè)過渡狀態(tài),但我們把member域名的代碼下線以后,發(fā)現(xiàn)很難把member1切換回member,因?yàn)橛行┑胤桨焰溄訉懰懒耍谑呛髞砗荛L時(shí)間里我們都是在用member1.taobao.com這樣奇怪的域名。一年后,有另外一家互聯(lián)網(wǎng)公司開始做電子商務(wù)了,我們發(fā)現(xiàn)他們的域名也叫member1.xx.com、auction1.xx.com,復(fù)制得毫無保留,我們只能會(huì)心一笑。
說了開發(fā)模式,再說說用到的Java MVC框架,當(dāng)時(shí)的struts1.x是用得比較多的框架,但是用過webwork和struts2的人可能知道,struts1.x在多人協(xié)作方面有很多致命的弱點(diǎn),由于沒有一個(gè)輕量框架作為基礎(chǔ),因此,很難擴(kuò)展,這樣架構(gòu)師對(duì)于基礎(chǔ)功能和全局功能的控制就很難做到。而阿里巴巴的18個(gè)創(chuàng)始人之中,有個(gè)架構(gòu)師周悅虹,他在Jakarta Turbine的基礎(chǔ)上做了很多擴(kuò)展,打造了一個(gè)阿里巴巴自己用的MVC框架WebX (http://www.openwebx.org/docs/Webx3_Guide_Book.html ),這個(gè)框架易于擴(kuò)展,方便組件化開發(fā),它的頁面模板支持JSP和Velocity等,持久層支持ibatis和hibernate等,控制層可以用EJB和Spring(Spring是后來才有的)。項(xiàng)目組選擇了這個(gè)強(qiáng)大的框架。另外,當(dāng)時(shí)Sun在全世界大力推廣他們的EJB,雖然淘寶的架構(gòu)師認(rèn)為這個(gè)東西用不到,但他們還是極力堅(jiān)持。在經(jīng)歷了很多次的技術(shù)討論、爭論甚至爭吵之后,這個(gè)系統(tǒng)的架構(gòu)就變成了下圖的形式。
MVC框架是阿里的WebX,控制層用了EJB,持久層是ibatis。另外,為了緩解數(shù)據(jù)庫的壓力,商品查詢和店鋪查詢放在搜索引擎中。這個(gè)架構(gòu)圖是不是好看了一點(diǎn)了?Sun的這幫工程師開發(fā)完淘寶的網(wǎng)站之后,用同樣的架構(gòu)又做了一個(gè)很牛的網(wǎng)站,叫“支付寶”。(上一篇說過支付寶最初是淘寶上的“安全交易”功能,這個(gè)功能后來獨(dú)立出來,成立了一個(gè)網(wǎng)站,也成立了一個(gè)公司,就是現(xiàn)在的支付寶。把支付寶從淘寶分出去的人,就是Sun公司的這幾個(gè)人。)下圖是支付寶的***次員工大會(huì)。
上面的架構(gòu)中,引入了搜索引擎iSearch(前文說過,iSearch其實(shí)是在LAMP系統(tǒng)運(yùn)行一段時(shí)間之后被多隆引進(jìn)的,換為Oracle之后只是替換一下數(shù)據(jù)源)。其實(shí)這個(gè)搜索引擎的原理很簡單,就是把數(shù)據(jù)庫里的數(shù)據(jù)dump(傾倒)成結(jié)構(gòu)化的文本文件后,放在硬盤上,提供Web應(yīng)用以約定的參數(shù)和語法來查詢這些數(shù)據(jù)。這看起來不難,難的是數(shù)以億計(jì)的信息,怎么做到快速更新呢?這好比你做了一個(gè)網(wǎng)站,在百度上很快就能搜到,你一定很滿意了。但如果你發(fā)布一件商品,在淘寶上過1個(gè)小時(shí)還搜不到,你肯定要郁悶了。另一個(gè)難點(diǎn)是如何保證非常高的容量和并發(fā)量?再往后面就要考慮斷句和語義分析的問題,以及推薦算法等更加智能的問題。這些內(nèi)容先不詳細(xì)介紹,因?yàn)樗阉饕娴募夹g(shù)已經(jīng)足以寫好幾本書了。
其實(shí)在任何時(shí)候,開發(fā)語言本身都不是系統(tǒng)的瓶頸,業(yè)務(wù)帶來的壓力更多的存在于數(shù)據(jù)和存儲(chǔ)方面。前面也說到,MySQL撐不住之后換為Oracle,Oracle的存儲(chǔ)一開始在本機(jī)上,后來在NAS上,NAS撐不住了用EMC的SAN存儲(chǔ),再后來,Oracle的RAC撐不住了,數(shù)據(jù)的存儲(chǔ)方面就不得不考慮使用小型機(jī)。在2004年夏天,DBA七公、測試工程師郭芙和架構(gòu)師行癲,踏上了去北京測試小型機(jī)的道路。他們帶著小型機(jī)回來的時(shí)候,我們像歡迎***一樣歡迎他們,因?yàn)槟鞘俏覀冏钪靛X的設(shè)備,價(jià)格表上的數(shù)字嚇?biāo)廊?。小型機(jī)買回來之后,我們爭相合影,然后Oracle就運(yùn)行在了小型機(jī)上,存儲(chǔ)方面,從EMC低端CX存儲(chǔ)到Sun oem hds高端存儲(chǔ),再到EMC dmx高端存儲(chǔ),一級(jí)一級(jí)地往上跳。
到2004年底,淘寶網(wǎng)已經(jīng)有4百多萬種商品了,日均4千多萬個(gè)PV,注冊(cè)會(huì)員達(dá)400萬個(gè),全網(wǎng)成交額達(dá)10億元。
到現(xiàn)在為止,我們已經(jīng)用上了IBM的小型機(jī)、Oracle的數(shù)據(jù)EMC的存儲(chǔ),這些東西都是很貴的,那些年可以說是花錢如流水。有人說過“錢能解決的問題,就不是問題”,但隨著淘寶網(wǎng)的發(fā)展,在不久以后,錢已經(jīng)解決不了我們的問題了。花錢買豪華的配置,也許能支持1億個(gè)PV的網(wǎng)站,但淘寶網(wǎng)的發(fā)展實(shí)在是太快了,到了10億個(gè)PV怎么辦?到了百億怎么辦?在幾年以后,我們不得不創(chuàng)造技術(shù),解決這些只有世界***的網(wǎng)站才會(huì)遇到的問題。后來我們?cè)陂_源軟件的基礎(chǔ)上進(jìn)行自主研發(fā),一步一步地把IOE(IBM小型機(jī)、Oracle、EMC存儲(chǔ))這幾個(gè)“神器”都去掉了。這些神器就如同《西游記》中那些神仙的兵器,他們身邊的妖怪們拿到這些兵器能把猴子打得落荒而逃。但最牛的神仙是不依賴這些神器的,他們揮一揮衣袖、翻一下手掌就威力無比了。
堅(jiān)若磐石——圍繞性能、容量和成本的進(jìn)化已經(jīng)有讀者在迫不及待地問怎么去掉了IOE?別急,在去掉IOE之前還有很長的路要走(在后面講到TDDL的時(shí)候,會(huì)提到去IOE的一些事情)。行癲等人買回小型機(jī)之后,我們用上了。