09 | 架構設計原則案例

淘寶技術發(fā)展主要經(jīng)歷了“個人網(wǎng)站”→“Oracle/ 支付寶 / 旺旺”→“Java 時代 1.0”→“Java 時代 2.0”→“Java 時代 3.0”→“分布式時代”祸憋。每個階段的主要驅動力是什么御滩。

1. 個人網(wǎng)站

淘寶當時在初創(chuàng)時概说,沒有過多考慮技術是否優(yōu)越、性能是否海量以及穩(wěn)定性如何,主要的考慮因素就是:快!

買一個什么樣的網(wǎng)站?方便地擴展和二次開發(fā)胸囱。答案是:輕量一點的,簡單一點的妹卿。

買一個系統(tǒng)是為了“快速可用”旺矾,而買一個輕量級的系統(tǒng)是為了“快速開發(fā)”。主要遵循的是“合適原則”和“簡單原則”夺克。第一代的技術架構如圖所示箕宙。

2.Oracle/ 支付寶 / 旺旺

在 2003 年底,MySQL 已經(jīng)撐不住了铺纽。

一般人或者團隊在這個時候柬帕,可能就開始優(yōu)化系統(tǒng)、優(yōu)化架構狡门、分拆業(yè)務了陷寝,因為這些是大家耳熟能詳也很拿手的動作。淘寶這個時候:換 Oracle 的原因除了它容量大其馏、穩(wěn)定凤跑、安全、性能高叛复,還有人才方面的原因仔引。

除了購買 Oracle,后來為了優(yōu)化褐奥,又買了更強大的存儲:

后來數(shù)據(jù)量變大了咖耘,本地存儲不行了。買了 NAS(Network Attached Storage撬码,網(wǎng)絡附屬存儲)儿倒,NetApp 的 NAS 存儲作為了數(shù)據(jù)庫的存儲設備,加上 Oracle RAC(Real Application Clusters呜笑,實時應用集群)來實現(xiàn)負載均衡夫否。

第一階段買的是“方案”,這個階段買的就是“性能”叫胁,這里架構設計和選擇主要遵循的還是“合適原則”和“簡單原則”慷吊。

3. 脫胎換骨的 Java 時代 1.0

淘寶切換到 Java 的原因很有趣,主要因為找了一個 PHP 的開源連接池 SQL Relay 連接到 Oracle曹抬,而這個代理經(jīng)常死鎖,死鎖了就必須重啟,而數(shù)據(jù)庫又必須用 Oracle谤民,于是決定換個開發(fā)語言堰酿。最后淘寶挑選了 Java,而且當時挑選 Java张足,也是請 Sun 公司的人触创,這幫人很歷害,先是將淘寶網(wǎng)站從 PHP 熱切換到了 Java为牍,后來又做了支付寶哼绑。

頻繁的死鎖和重啟對用戶業(yè)務產(chǎn)生了嚴重的影響,從業(yè)務的角度來看這是不得不解決的技術問題碉咆。

但這次淘寶為什么沒有去“買”呢抖韩?我們看最初選擇 SQL Relay 的原因:

但對于 PHP 語言來說,它是放在 Apache 上的疫铜,每一個請求都會對數(shù)據(jù)庫產(chǎn)生一個連接茂浮,它沒有連接池這種功能(Java 語言有 Servlet 容器,可以存放連接池)壳咕。那如何是好呢席揽?這幫人打探到 eBay 在 PHP 下面用了一個連接池的工具,是 BEA 賣給他們的谓厘。我們知道 BEA 的東西都很貴幌羞,我們買不起,于是多隆在網(wǎng)上尋尋覓覓竟稳,找到一個開源的連接池代理服務 SQL Relay属桦。

不清楚當時到底有多貴,Oracle 都可以買住练,連接池買不起 地啰?所以我個人感覺這次切換語言,更多是為以后業(yè)務發(fā)展做鋪墊讲逛,畢竟當時 PHP 語言遠遠沒有 Java 那么火亏吝、那么好招人。淘寶選擇 Java 語言的理由可以從側面驗證這點:

Java 是當時最成熟的網(wǎng)站開發(fā)語言盏混,它有比較良好的企業(yè)開發(fā)框架蔚鸥,被世界上主流的大規(guī)模網(wǎng)站普遍采用,另外有 Java 開發(fā)經(jīng)驗的人才也比較多许赃,后續(xù)維護成本會比較低止喷。

綜合來看,這次架構的變化沒有再簡單通過“買”來解決混聊,而是通過重構來解決弹谁,架構設計和選擇遵循了“演化原則”

4. 堅若磐石的 Java 時代 2.0

Java 時代 2.0,淘寶做了很多優(yōu)化工作:數(shù)據(jù)分庫预愤、放棄 EJB沟于、引入 Spring、加入緩存植康、加入 CDN旷太、采用開源的 JBoss∠觯看起來沒有章法可循供璧,其實都是圍繞著提高容量、提高性能冻记、節(jié)約成本來做的睡毒。

就是“買”也搞不定了,此時的業(yè)務發(fā)展情況是這樣的:隨著數(shù)據(jù)量的繼續(xù)增長檩赢,到了 2005 年吕嘀,商品數(shù)有 1663 萬,PV 有 8931 萬贞瞒,注冊會員有 1390 萬偶房,這給數(shù)據(jù)和存儲帶來的壓力依然很大,數(shù)據(jù)量大军浆,性能就慢棕洋。

整個架構上去進行調整和優(yōu)化。比如說 Oracle 再強大乒融,在做 like 類搜索的時候掰盘,也不可能做到純粹的搜索系統(tǒng)如 Solr、Sphinx 等的性能赞季,因為這是機制決定的愧捕。

另外,隨著規(guī)模的增大申钩,純粹靠買的一個典型問題開始成為重要的考慮因素次绘,那就是成本。當買一臺兩臺 Oracle 的時候撒遣,可能對成本并不怎么關心邮偎,但如果要買 100 臺 Oracle,成本就是一個關鍵因素了义黎。這就是“量變帶來質變”的一個典型案例禾进,業(yè)務和系統(tǒng)發(fā)生質變后,架構設計遵循“演化原則”的思想廉涕,需要再一次重構甚至重寫泻云。

5.Java 時代 3.0 和分布式時代

Java 時代 3.0 我個人認為是淘寶技術飛躍的開始艇拍,商用轉為“自研”,典型的就是去 IOE 化宠纯。

分布式時代我認為是淘寶技術的修煉成功淑倾,到了這個階段,自研技術已經(jīng)自成一派征椒,除了支撐本身的海量業(yè)務,也開始影響整個互聯(lián)網(wǎng)的技術發(fā)展湃累。

到了這個階段勃救,業(yè)務規(guī)模急劇上升后,原來并不是主要復雜度的 IOE 成本開始成為了主要的問題治力,因此通過自研系統(tǒng)來降低 IOE 的成本蒙秒,去 IOE 也是系統(tǒng)架構的再一次演化。

手機 QQ

注:以下部分內容摘自《QQ 1.4 億在線背后的故事》宵统。

手機 QQ 的發(fā)展歷程按照用戶規(guī)脑谓玻可以粗略劃分為 4 個階段:十萬級、百萬級马澈、千萬級瓢省、億級,不同的用戶規(guī)模痊班,IM 后臺的架構也不同勤婚,而且基本上都是用戶規(guī)模先上去,然后產(chǎn)生各種問題涤伐,倒逼技術架構升級馒胆。

1. 十萬級 IM 1.X

最開始的手機 QQ 后臺是這樣的,可以說是簡單得不能再簡單凝果、普通得不能再普通的一個架構了祝迂,因為當時業(yè)務剛開始,架構設計遵循的是“合適原則”和“簡單原則”器净。

2. 百萬級 IM 2.X

隨著業(yè)務發(fā)展到 2001 年型雳,QQ 同時在線人數(shù)也突破了一百萬。第一代架構很簡單掌动,明顯不可能支撐百萬級的用戶規(guī)模四啰,主要的問題有:

以接入服務器的內存為例,單個在線用戶的存儲量約為 2KB粗恢,索引和在線狀態(tài)為 50 字節(jié)柑晒,好友表 400 個好友 × 5 字節(jié) / 好友 = 2000 字節(jié),大致來說眷射,2GB 內存只能支持一百萬在線用戶匙赞。

CPU/ 網(wǎng)卡包量和流量 / 交換機流量等瓶頸佛掖。

單臺服務器支撐不下所有在線用戶 / 注冊用戶。

于是針對這些問題做架構改造涌庭,按照“演化原則”的指導進行了重構芥被,重構的方案相比現(xiàn)在來說也還是簡單得多,因此當時做架構設計時也遵循了“合適原則”和“簡單原則”坐榆。IM 2.X 的最終架構如圖所示拴魄。

3. 千萬級 IM 3.X

業(yè)務發(fā)展到 2005 年,QQ 同時在線人數(shù)突破了一千萬席镀。第二代架構支撐百萬級用戶是沒問題的匹中,但支撐千萬級用戶又會產(chǎn)生新問題,表現(xiàn)有:

同步流量太大豪诲,狀態(tài)同步服務器遇到單機瓶頸顶捷。

所有在線用戶的在線狀態(tài)信息量太大,單臺接入服務器存不下屎篱,如果在線數(shù)進一步增加服赎,甚至單臺狀態(tài)同步服務器也存不下。

單臺狀態(tài)同步服務器支撐不下所有在線用戶交播。

單臺接入服務器支撐不下所有在線用戶的在線狀態(tài)信息重虑。

針對這些問題,架構需要繼續(xù)改造升級堪侯,再一次“演化”嚎尤。IM 3.X 的最終架構如下圖,可以看到這次的方案相比之前的方案來說并不簡單了伍宦,這是業(yè)務特性決定的芽死。

4. 億級 IM 4.X

業(yè)務發(fā)展到 2010 年 3 月,QQ 同時在線人數(shù)過億次洼。第三代架構此時也不適應了关贵,主要問題有:

靈活性很差,比如“昵稱”長度增加一半卖毁,需要兩個月揖曾;增加“故鄉(xiāng)”字段,需要兩個月亥啦;最大好友數(shù)從 500 變成 1000炭剪,需要三個月。

無法支撐某些關鍵功能翔脱,比如好友數(shù)上萬奴拦、隱私權限控制、PC QQ 與手機 QQ 不可互踢届吁、微信與 QQ 互通错妖、異地容災绿鸣。

除了不適應,還有一個更嚴重的問題:

IM 后臺從 1.0 到 3.5 都是在原來基礎上做改造升級的暂氯,但是持續(xù)打補丁已經(jīng)難以支撐億級在線潮模,IM 后臺 4.0 必須從頭開始,重新設計實現(xiàn)痴施!

這里再次遵循了“演化原則”擎厢,決定重新打造一個這么復雜的系統(tǒng),不得不佩服當時決策人的勇氣和魄力辣吃!

重新設計的 IM 4.0 架構如圖所示锉矢,和之前的架構相比,架構本身都拆分為兩個主要的架構:存儲架構和通信架構齿尽。

存儲架構

通信架構

小結

搜索一個互聯(lián)網(wǎng)大廠(BATJ、TMD 等)的架構發(fā)展案例灯节,分析一下其發(fā)展過程循头,看看哪些地方體現(xiàn)了這三條架構設計原則。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末炎疆,一起剝皮案震驚了整個濱河市卡骂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌形入,老刑警劉巖全跨,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亿遂,居然都是意外死亡浓若,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門蛇数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪钓,“玉大人,你說我怎么就攤上這事耳舅÷瞪希” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵浦徊,是天一觀的道長馏予。 經(jīng)常有香客問我,道長盔性,這世上最難降的妖魔是什么霞丧? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮纯出,結果婚禮上蚯妇,老公的妹妹穿的比我還像新娘敷燎。我一直安慰自己,他們只是感情好箩言,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布硬贯。 她就那樣靜靜地躺著,像睡著了一般陨收。 火紅的嫁衣襯著肌膚如雪饭豹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天务漩,我揣著相機與錄音拄衰,去河邊找鬼。 笑死饵骨,一個胖子當著我的面吹牛翘悉,可吹牛的內容都是我干的。 我是一名探鬼主播居触,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妖混,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轮洋?” 一聲冷哼從身側響起制市,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弊予,沒想到半個月后祥楣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汉柒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年误褪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碾褂。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡振坚,死狀恐怖,靈堂內的尸體忽然破棺而出斋扰,到底是詐尸還是另有隱情渡八,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布传货,位于F島的核電站屎鳍,受9級特大地震影響,放射性物質發(fā)生泄漏问裕。R本人自食惡果不足惜逮壁,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粮宛。 院中可真熱鬧窥淆,春花似錦卖宠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至词裤,卻和暖如春刺洒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吼砂。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工逆航, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渔肩。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓因俐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親周偎。 傳聞我的和親對象是個殘疾皇子女揭,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評論 25 707
  • ** 無他,想證明自己還有學習的能力 ** 第一次聽說雙拼栏饮,是曾經(jīng)的一個熱門回答,十五天能夠學會的小技能磷仰。其中一個...
    錦鯉熊閱讀 1,122評論 0 3
  • 2018.05.28 19:30鐵粉群 分享老師:彩慧 一袍嬉、30分鐘閱讀一本書的心態(tài) 四個閱讀心態(tài)的調整 1....
    我的魚兒閱讀 329評論 0 0
  • 隔天星子遠,嬌玉半垂簾灶平。蒲月淺嘗稍入夏伺通,歇柳不飄棉。 晚晴應不雨逢享,青傘伴孤眠罐监。憑窗知風一簟影,昔人夢里還瞒爬。
    淮揚先生閱讀 112評論 1 4
  • 深圳市部分藥店弓柱、商場銷售‘偽嬰幼兒食品’卻不被處罰 食品實行的許可生產(chǎn)經(jīng)營,是法律法規(guī)為保證食品安全對食品生產(chǎn)經(jīng)營...
    虛假發(fā)現(xiàn)閱讀 1,185評論 0 1