淘寶技術發展(分布式時代:服務化)

jopen 12年前發布 | 104K 次閱讀 淘寶 軟件架構

在系統發展的過程中,架構師的眼光至關重要,作為程序員,把功能實現即可,但作為架構師,要考慮系統的擴展性、重用性,這種敏銳的感覺,有人說是一種代碼潔癖。淘寶早期有幾個架構師具備了這種感覺。一指開發的Webx是一個擴展性很強的框架,行癲在這個框架上插入了數據分庫路由的模塊、session框架等等。在做淘寶后臺系統的時候,同樣需要這幾個模塊,行癲指導我把這些模塊單獨打成了jar包。 另外在做淘寶機票、彩票系統的時候,頁面端也有很多東西需要復用,最直觀的是頁頭和頁腳,一開始我們每個系統里面復制了一份過去,但奇妙的是,那段時間頁 腳要經常修改,例如把“雅虎中國”改成“中國雅虎”,過一段時間又加了一個“口碑網”,再過一段時間變成了“雅虎口碑”,最后又變成了“中國雅虎”,每個 系統都改一遍,折騰啊。后來我就把這部分velocity模版單獨拿出來了,做成了公用的模塊。

上面這些都是比較小的復用模塊,到2006年 我們做了一個商品類目屬性的改造,在類目里面引入屬性的概念。項目的代號叫做“泰山”,如同它的名字,這是一個舉足輕重的項目,這個改變是一個劃時代的創 新。在這之前的三年時間內,商品的分類都是按照樹狀的一級一級的節點來分的,隨著商品數量的增長,類目也變得越來越深,越來越復雜,這帶給買家的就是查找 一件商品要逐級類目點開,找商品之前要懂商品的分類。而淘寶運營部門管理類目的小二也發現一個很嚴重的問題——例如男裝里面有T恤、T恤下面有耐克、耐克有純棉的,女裝里面也有T恤、T恤下面還是有耐克、耐克下面依然有純棉的,那是先分男女裝再分款式再分品牌再分材質呢?還是先分品牌再分款式再分材質再分男女呢?暈倒了。這時候,一位大俠出來了——一燈,他說品牌、款式、材質這種東東可以叫做“屬性”,屬性是類似tag的 一個概念,與類目相比更加離散,更加靈活,這樣也縮減了類目的深度。這個思想的提出,一舉解決了分類的難題!從系統的角度來看,我們建立了“屬性”這樣一 個數據結構,由于除了類目的子節點有屬性,父節點也有可能有屬性,于是類目屬性合起來也是一個結構化的數據對象。這個做出來之后我們把它獨立出來作為一個 服務,叫做catservercategory server)。跟類目屬性密切關聯的商品搜索功能,獨立出來,叫做hesper(金星),catserverhesper供淘寶的前后臺系統調用。

現在淘寶的商品類目屬性已經是地球上最大的了,幾乎沒有什么類目的商品在淘寶上找不到(除了違禁的),但最初類目屬性改造完之后,我們很缺屬性數據,尤其 是數碼類的最缺。那從哪里弄這些數據呢親?我們跟“中關村在線”合作,拿到了很多數據,那個時候,很多商品屬性信息的后邊標注著:“來自中關村在線”。有 了類目屬性,給運營的工作帶來很大的便利,我們知道淘寶的運營主要就是類目的運營,什么季節推什么商品,都要在類目屬性上面做調整,讓買家更容易找到。例 如夏天我要用戶在女裝一級類目下就標出來材質是不是蕾絲的、是不是純棉的,冬天卻要把羽絨衣調到女裝一級類目下,流行什么就要把什么商品往更高級的類目調 整。這樣類目和屬性要經常調整,隨之而來的問題就顯現了——調整到哪個類目,那類商品的賣家就要編輯一次自己的商品,隨著商品量的增長,賣家的工作量越來 越大,然后我們就發現賣家受不了啦。到了2008年,我們研究 了超市里面前后臺商品的分類,發現超市前臺商品可以隨季節和關聯來調整擺放場景(例如著名的啤酒和尿布的關聯),后臺倉庫里面要按照自然類目來存儲,二者 密切關聯卻又相互分開。然后我們就把前后臺類目分開了,這樣賣家發布商品選擇的是自然類目和屬性,淘寶前臺展示的是根據運營需要而擺放的商品的類目和屬 性。改造后的類目屬性服務取名叫做forest(森林,跟類目屬性有點神似。catserver還在,提供賣家授權、品牌服務、關鍵詞等相關的服務)。類目屬性的服務化,是淘寶在系統服務化方面做的第一個探索。

雖然個別架構師具備了代碼潔癖,但淘寶前臺系統的業務量和代碼量還是爆炸式的增長了起來。業務方總在后面催,開發人員不夠了就繼續招人,招來的人根本看不 懂原來的業務,只好摸索著在“合適的地方”加一些“合適的代碼”,看看運行起來像那么回事,就發布上線了。在這樣的惡性循環中,系統越來越臃腫,業務的耦 合性越來越高,開發的效率越來越低。借用當時比較流行的一句話“寫一段代碼,編譯一下能通過,半個小時就過去了;編譯一下沒通過,半天就過去了。”在這種 情況下,系統出錯的概率也逐步增長,常常是你改了商品相關的某些代碼,發現交易出問題了,甚至你改了論壇上的某些代碼,旺旺出問題了。這讓開發人員苦不堪 言,而業務方還認為這幫人干活越來越慢了。

大概是在2007年 底的時候,研發部空降了一位從硅谷來的高管,空聞大師。空聞是一位溫厚的長者,他告訴我們一切要以穩定為中心,所有影響系統穩定的因素都要解決掉。例如每 做一個日常修改,都必須整個系統回歸測試一遍;多個日常修改如果放在一個版本里面,要是一個功能沒有測試通過,整個系統都不能發布。我們把這個叫做“火車 模型”,任何一個乘客沒有上車,都不許發車。這樣做的最直接后果就是火車一直晚點,新功能上線更慢了,我們能明顯的感覺到業務方的不滿,空聞的壓力肯定非 常大。當時我都不理解這種一刀切的做法,為了穩定犧牲了發展的速度,這跟某Party的“穩定壓倒一切”有什么分別?

但是到現在回過頭來看看,其實我們并沒有理解背后的思路。正是在這種要求下,我們不得不開始改變一些東西,例如把回歸測試日常化,每天晚上都跑一遍整個系 統的回歸。還有就是在這種要求下,我們不得不對這個超級復雜的系統做肢解和重構,其中復用性最高的一個模塊——用戶信息模塊開始拆分出來了,我們叫它UICuser information center)。在UIC里面,它只處理最基礎的用戶信息操作,例如getUserByIdgetUserByName等等。

在另外一個方面,還有兩個新興的業務,也對系統基礎功能的拆分提出了要求。在那個時候,我們做了淘寶旅行(trip.taobao.com)和淘寶彩票(caipiao.taobao.com) 兩個新業務,這兩個新業務在商品的展示和交易的流程上都跟主站的業務不一樣,機票是按照航班的信息展示的,彩票是按照雙色球、數字和足球的賽程來展示的。 但用到的會員的功能和交易的功能是跟主站差不多的,當時做的時候就很糾結,在主站里面做的話,會有一大半跟主站無關的東西,重新做一個的話,會有很多重復 建設。最終我們決定不再給主站添亂了,就另起爐灶做了兩個新的業務系統。從查詢商品、購買商品、評價反饋、查看訂單這一整個流程都重新寫了一套出來。現在 在“我的淘寶”里面查看交易記錄的時候,還能發現“已買到的寶貝”里面把機票和彩票另外列出來了,他們沒有加入到普通的訂單里面去。在當時如果已經把會 員、交易、商品、評價這些模塊拆分出來,就不用什么都重做一遍了。

淘寶技術發展(分布式時代:服務化)

2008年初,整個主站系統(有了機票、彩票系統之后,把原來的系統叫做主站)的容量已經到了瓶頸,商品數在一億以上,PV2.5億以上,會員數超過了五千萬。這個時候Oracle的連接池數量都不夠用了,數據庫的容量到了極限,上層系統再增加機器也無法繼續擴容了,我們只有把底層的基礎服務繼續拆分,從底層開始擴容,上層才能擴展,這才能容納以后三五年的增長。

于是那一年我們專門啟動了一個更大的項目,把交易這個核心業務模塊也拆分出來了。原來的淘寶交易除了跟商品管理耦合在一起,也在支付寶和淘寶之間跳來跳去,跟支付寶耦合在一起,系統復雜,用戶體驗也很不好。我們把交易的底層業務拆出來叫交易中心TCtrade center),所謂底層業務是例如創建訂單、減庫存、修改訂單狀態等原子型的操作;交易的上層業務叫交易管理TMtrade manager),例如拍下一件普通商品要對訂單、庫存、物流進行操作,拍下虛擬商品不需要對物流進行操作,這些在TM里面完成。這個項目取了一個很沒有創意的名字——“千島湖”,這幫開發人員取這個名字的目的是想在開發完畢之后,去千島湖玩一圈,后來他們如愿以償了。這個時候還有一個項目也在搞,就是淘寶商城,之前拆分出來的那些基礎服務,給商城的快速構建,提供了良好的基礎。

淘寶技術發展(分布式時代:服務化)

 

類目屬性、用戶中心、交易中心,隨著這些模塊逐步的拆分和服務化改造,我們在系統架構方面也積累了不少的經驗。到2008年底干脆做了一個更大的項目,把淘寶所有的業務都模塊化,這是繼2004年從LAMP架構到Java架構之后的第二次脫胎換骨。這個項目取了一個很霸氣的名字,叫“五彩石”(女媧煉石補天,用的石頭)。這個系統重構的工作非常驚險,有人稱之為“給一架高速飛行的飛機換發動機”。

五彩石項目發布之后,這幫工程師去三亞玩了幾天。他們把淘寶的系統拆分成了如下架構:

 淘寶技術發展(分布式時代:服務化)

淘寶技術發展(分布式時代:服務化)

其中UICForest上文說過,TCICSC分別是交易中心(Trade Center)、商品中心(Item Center)、店鋪中心(Shop Center),這些中心級別的服務只提供原子級的業務邏輯,如根據ID查找商品、創建交易、減少庫存等操作。再往上一層是業務系統TMTrade Manager交易業務)、IMItem Manager商品業務)、SMShop Manager,因為不好聽,所以后來改名叫SSShop System,店鋪業務)、Detail(商品詳情)。

拆分之后,系統之間的交互關系變得非常復雜,示意圖如下:

淘寶技術發展(分布式時代:服務化)

系統這么拆分的話,好處顯而易見,拆分之后每個系統可以單獨部署,業務簡單,方便擴容;有大量可重用的模塊以便于開發新的業務;能夠做到專人專事,讓技術 人員更加專注于某一個領域。這樣要解決的問題也很明顯,分拆之后,系統之間還是必須要打交道的,越往底層的系統,調用它的客戶方越多,這就要求底層的系統 必須具有超大規模的容量和非常高的可用性。另外,拆分之后的系統如何通訊?這里需要兩種中間件系統,一種是實時調用的中間件(淘寶的HSF,高性能服務框架)、一種是異步消息通知的中間件(淘寶的Notify)。另外還有一個需要解決的問題是用戶在A系統登錄了,到B系統的時候,用戶的登錄信息怎么保存?這又涉及到一個Session框架。再者,還有一個軟件工程方面的問題,這么多層的一套系統,怎么去測試它?

原文出處:http://blog.sina.com.cn/s/blog_6332199701013c3t.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!