看京東系統(tǒng)架構(gòu)師如何讓笨重的架構(gòu)變得靈巧

隨著業(yè)務(wù)的復(fù)雜性增大、系統(tǒng)吞吐量增長(zhǎng),所有功能統(tǒng)一部署難度加大家厌,各個(gè)功能模塊相互影響,使系統(tǒng)變的笨重且脆弱其爵;

因此需要對(duì)業(yè)務(wù)進(jìn)行拆分、對(duì)系統(tǒng)進(jìn)行解耦伸蚯、對(duì)系統(tǒng)內(nèi)部架構(gòu)升級(jí)摩渺,來(lái)提升系統(tǒng)容量及健壯性。

接下來(lái)主要分兩部分介紹:系統(tǒng)拆分與結(jié)構(gòu)演變剂邮;文章首發(fā):公眾號(hào)java大牛愛(ài)好者

系統(tǒng)拆分

系統(tǒng)拆分從資源角度分為:應(yīng)用拆分和數(shù)據(jù)庫(kù)拆分摇幻;

從采用的先后順序可分為:水平擴(kuò)展、垂直拆分挥萌、業(yè)務(wù)拆分绰姻、水平拆分;

圖1 系統(tǒng)分解原則

1引瀑、水平擴(kuò)展

水平擴(kuò)展是最初始的解決的手段狂芋,也是系統(tǒng)遇到瓶頸的首選方案,主要從以下兩個(gè)方面擴(kuò)展:

  • 應(yīng)用加實(shí)例憨栽,搞集群银酗,把系統(tǒng)吞吐量擴(kuò)上去。

  • 數(shù)據(jù)庫(kù)利用主從進(jìn)行讀寫(xiě)分離徒像,數(shù)據(jù)庫(kù)其實(shí)是系統(tǒng)最應(yīng)該保護(hù)的資源。

2蛙讥、垂直拆分

垂直拆分才是真正開(kāi)始拆分系統(tǒng)锯蛀,主要是從業(yè)務(wù)功能角度拆分。如拆出用戶系統(tǒng)次慢、商品系統(tǒng)旁涤、交易系統(tǒng)等翔曲。

為了解決拆分后各個(gè)子系統(tǒng)之間相互依賴調(diào)用的問(wèn)題,這時(shí)會(huì)引入服務(wù)調(diào)用治理劈愚。

系統(tǒng)復(fù)雜度有所加大瞳遍,但系統(tǒng)基本解耦,穩(wěn)定性相對(duì)提高菌羽,做好降級(jí)就能避免因其它系統(tǒng)功能異常導(dǎo)致系統(tǒng)崩潰掠械。

業(yè)務(wù)對(duì)應(yīng)的庫(kù)也會(huì)按照對(duì)應(yīng)的業(yè)務(wù)進(jìn)行拆分出用戶庫(kù)、商品庫(kù)注祖、交易庫(kù)等猾蒂。

3、業(yè)務(wù)拆分

業(yè)務(wù)拆分主要是針對(duì)應(yīng)用層面按功能特點(diǎn)拆分是晨,如交易拆分出:購(gòu)物車肚菠、結(jié)算頁(yè)、訂單罩缴、秒殺等系統(tǒng)蚊逢。然后根據(jù)業(yè)務(wù)的特點(diǎn),針對(duì)性做處理箫章,如秒殺系統(tǒng)烙荷,由于同時(shí)參加秒殺的商品有限,可以提前把商品信息加載到JVM緩存中炉抒,自身減少外部調(diào)用提高性能奢讨,同時(shí)商品系統(tǒng)也減輕壓力。

數(shù)據(jù)庫(kù)拆分也可以分為幾步:垂直分表焰薄、垂直分庫(kù)拿诸、水平分表、水平分庫(kù)分表塞茅;

垂直分表是指大表拆多張小表亩码,可以根據(jù)字段更新或查詢頻次拆分;

圖2 商品表拆分

垂直分庫(kù)是指按業(yè)務(wù)拆庫(kù)野瘦,如拆出訂單庫(kù)描沟、商品庫(kù)、用戶庫(kù)等

水平分表是解決數(shù)據(jù)量大鞭光,把一張表拆成多張表吏廉;

水平分庫(kù)分表是更進(jìn)一步拆分表;

圖3 分庫(kù)分表

4惰许、水平拆分

服務(wù)分層席覆,系統(tǒng)服務(wù)積木化,拆分功能與非功能系統(tǒng)汹买,以及業(yè)務(wù)組合的系統(tǒng)佩伤,如最近比較火的大中臺(tái)或前臺(tái)拆分聊倔;

中臺(tái)為積木組件,承擔(dān)服務(wù)功能輸出生巡。前臺(tái)更多的是組合積木服務(wù)耙蔑,及時(shí)響應(yīng)業(yè)務(wù)發(fā)展,如在電商網(wǎng)站單品頁(yè)能看見(jiàn)主圖孤荣、價(jià)格甸陌、庫(kù)存、優(yōu)惠券或推薦等信息垃环,都是組合各積木組件呈現(xiàn)邀层。

數(shù)據(jù)庫(kù)也可以進(jìn)行冷熱數(shù)據(jù)分離;

過(guò)期或過(guò)季商品可以歸檔遂庄,比如諾基亞3210手機(jī)寥院,早已經(jīng)停產(chǎn)且沒(méi)有銷售;

用戶查看訂單時(shí)涛目,更多的只是查看最近1秸谢、2年信息,2年前數(shù)據(jù)查看量少霹肝,在存儲(chǔ)設(shè)計(jì)時(shí)可以區(qū)別處理估蹄。

結(jié)構(gòu)演變

結(jié)構(gòu)演變主要是隨著系統(tǒng)復(fù)雜度增加及對(duì)性能要求提高而不得不做的系統(tǒng)內(nèi)部架構(gòu)升級(jí);

早期系統(tǒng)基本是應(yīng)用直聯(lián)數(shù)據(jù)庫(kù)沫换,但在系統(tǒng)進(jìn)行拆分后臭蚁,功能本系統(tǒng)不能單獨(dú)完成,需要依賴其它系統(tǒng)讯赏,就出現(xiàn)遠(yuǎn)程調(diào)用垮兑;

圖4 早期應(yīng)用結(jié)構(gòu)

隨著自身系統(tǒng)的業(yè)務(wù)發(fā)展,對(duì)性能要求高漱挎,而數(shù)據(jù)庫(kù)一定程度上成為瓶頸系枪,就會(huì)引入緩存及索引,分別解決key-value及復(fù)雜檢索磕谅;

索引加緩存現(xiàn)在已經(jīng)成為解決高并發(fā)的基本方案私爷,但在實(shí)施過(guò)程會(huì)有所區(qū)別;

14年對(duì)3億熱數(shù)據(jù)的系統(tǒng)升級(jí)時(shí)膊夹,技術(shù)選型為solr+redis衬浑,考慮到數(shù)據(jù)量過(guò)大,數(shù)據(jù)在solr中只存index放刨,而結(jié)果只存并返回主鍵id嚎卫,再通過(guò)id從redis中讀取數(shù)據(jù),redis也不存放全部數(shù)據(jù),數(shù)據(jù)設(shè)置過(guò)期時(shí)間拓诸,若未命中redis,回源數(shù)據(jù)庫(kù)查詢并反寫(xiě)redis麻昼;

主要考慮資源與性能的平衡奠支,solr的存儲(chǔ)減少及IO性能提高,結(jié)果數(shù)據(jù)只在redis存放一份抚芦,redis的數(shù)據(jù)經(jīng)過(guò)運(yùn)行大部分是熱數(shù)據(jù)倍谜;

當(dāng)然現(xiàn)在也流行ES+Hbase組合。

圖5 增加緩存及索引

對(duì)于頻繁使用的數(shù)據(jù)叉抡,從集中緩存讀取尔崔,不一定達(dá)到性能要求,可以考慮把數(shù)據(jù)入JVM緩存褥民,如類目信息季春,類目是電商系統(tǒng)基本數(shù)據(jù),數(shù)據(jù)量不多消返,調(diào)用量大载弄;

個(gè)別情況下,使用ThreadLocal做線程內(nèi)緩存也是種有效手段撵颊,但需要考慮數(shù)據(jù)清除及有效性宇攻;

在修改商品信息時(shí),業(yè)務(wù)對(duì)商品信息的校驗(yàn)有名稱長(zhǎng)度倡勇、狀態(tài)逞刷、庫(kù)存及各業(yè)務(wù)模式等,而為了參數(shù)的統(tǒng)一校驗(yàn)方法參數(shù)為商品編號(hào)妻熊,導(dǎo)致各校驗(yàn)方法都需要讀取一次商品夸浅,使用線程緩存可以解決該問(wèn)題,性能提高了盡20ms固耘,讀取商品每分鐘減少近萬(wàn)次题篷;

圖6 增加本地緩存

有時(shí)所依賴系統(tǒng)性能不太穩(wěn)定,避免出現(xiàn)因第三方系統(tǒng)影響系統(tǒng)厅目,把依賴的服務(wù)進(jìn)行數(shù)據(jù)閉環(huán)番枚,與Dao一樣當(dāng)成系統(tǒng)的數(shù)據(jù)源;

如商品系統(tǒng)強(qiáng)依賴商家系統(tǒng)的商家信息服務(wù)损敷,若商家服務(wù)不穩(wěn)定葫笼,商品系統(tǒng)一半服務(wù)都不穩(wěn)定,采取對(duì)商家信息緩存一份拗馒,降低外部風(fēng)險(xiǎn)路星,把風(fēng)險(xiǎn)控制在自己手上;

圖7 遠(yuǎn)程服務(wù)進(jìn)化成數(shù)據(jù)源

用戶體驗(yàn)最近越來(lái)越重視,系統(tǒng)響應(yīng)時(shí)間性能要求也越來(lái)越高洋丐,異步化是很好的一種選擇:消息中間件呈昔;電商下單就是個(gè)很好的案例,在用戶點(diǎn)擊下單時(shí)友绝,服務(wù)端不直接保存數(shù)據(jù)堤尾,給訂單系統(tǒng)發(fā)送消息,就直接返回支付頁(yè)面迁客,在用戶支付過(guò)程中郭宝,訂單系統(tǒng)異步進(jìn)行數(shù)據(jù)保存;

業(yè)務(wù)層掷漱、數(shù)據(jù)層的范圍越來(lái)越寬泛粘室,業(yè)務(wù)層可以分為基礎(chǔ)服務(wù)與組合服務(wù);數(shù)據(jù)層分為數(shù)據(jù)源與索引緩存卜范;

依賴的技術(shù)或中間件需要有效的結(jié)合衔统,用于解決系統(tǒng)所遇到各種問(wèn)題。

圖8 復(fù)雜的結(jié)構(gòu)

最后

系統(tǒng)結(jié)構(gòu)慢慢變復(fù)雜先朦,穩(wěn)定性缰冤、健壯性逐漸提高;

技術(shù)選擇都需要結(jié)合業(yè)務(wù)痛點(diǎn)喳魏、技術(shù)儲(chǔ)備以及資源情況棉浸,否則就有些不切實(shí)際,泛泛而談刺彩;

以上是近幾年自己經(jīng)歷的技術(shù)變革及升級(jí)的總結(jié)迷郑,后續(xù)可以針對(duì)個(gè)別點(diǎn)進(jìn)行詳細(xì)分享。

作者:徐賢軍创倔,京東系統(tǒng)架構(gòu)師嗡害,從事架構(gòu)設(shè)計(jì)與開(kāi)發(fā)工作,熟悉各種開(kāi)源軟件架構(gòu)畦攘。在Web開(kāi)發(fā)霸妹、架構(gòu)優(yōu)化上有較豐富實(shí)戰(zhàn)經(jīng)歷。

感謝您的閱讀知押,如果你覺(jué)得我的公眾號(hào)還不錯(cuò)叹螟,請(qǐng)關(guān)注!同時(shí)還請(qǐng)多幫我推薦給你的朋友台盯,多謝了罢绽。

Java大牛愛(ài)好者:每天一篇java技術(shù)文章,不定時(shí)java干貨發(fā)送

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末静盅,一起剝皮案震驚了整個(gè)濱河市良价,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖明垢,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚣常,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袖外,警方通過(guò)查閱死者的電腦和手機(jī)史隆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曼验,“玉大人,你說(shuō)我怎么就攤上這事粘姜△拚眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵孤紧,是天一觀的道長(zhǎng)豺裆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)号显,這世上最難降的妖魔是什么臭猜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮押蚤,結(jié)果婚禮上蔑歌,老公的妹妹穿的比我還像新娘。我一直安慰自己揽碘,他們只是感情好次屠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著雳刺,像睡著了一般劫灶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掖桦,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天本昏,我揣著相機(jī)與錄音,去河邊找鬼枪汪。 笑死涌穆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的料饥。 我是一名探鬼主播蒲犬,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岸啡!你這毒婦竟也來(lái)了原叮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奋隶,沒(méi)想到半個(gè)月后擂送,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唯欣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嘹吨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片境氢。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟀拷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萍聊,到底是詐尸還是另有隱情问芬,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布寿桨,位于F島的核電站此衅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亭螟。R本人自食惡果不足惜挡鞍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望预烙。 院中可真熱鬧墨微,春花似錦、人聲如沸默伍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)也糊。三九已至炼蹦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狸剃,已是汗流浹背掐隐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钞馁,地道東北人虑省。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像僧凰,于是被迫代替她去往敵國(guó)和親探颈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 作者:徐賢軍训措,京東系統(tǒng)架構(gòu)師伪节,從事架構(gòu)設(shè)計(jì)與開(kāi)發(fā)工作光羞,熟悉各種開(kāi)源軟件架構(gòu)。在Web開(kāi)發(fā)怀大、架構(gòu)優(yōu)化上有較豐富實(shí)戰(zhàn)經(jīng)...
    灰色程序閱讀 162評(píng)論 0 1
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評(píng)論 2 89
  • 風(fēng)半盅纱兑,雨半盅。湖畔桃柳理妝容化借,櫻也醉花叢潜慎。 愁也濃,喜也濃蓖康。春入寒門(mén)鳳雍雍铐炫,悵望待歸鴻。
    小紅帽_8c52閱讀 262評(píng)論 0 1
  • 當(dāng)蒜焊, 離開(kāi)城市的喧囂驳遵, 回, 到農(nóng)村的家里山涡, 坐, 在門(mén)前的老柿子樹(shù)下唆迁, 望這一湖秋色鸭丛! 一湖秋色…… 湖里來(lái)了野...
    阿木洛克人閱讀 299評(píng)論 0 1
  • 1、基本使用 Volley適合輕量唐责、高并發(fā)的網(wǎng)絡(luò)請(qǐng)求鳞溉,但如果大數(shù)據(jù)量的操作,比如上傳下載文件鼠哥,就不太適合了熟菲。使用V...
    i冰點(diǎn)閱讀 838評(píng)論 0 6