如何让笨重的系统架构变灵巧?
圖片來(lái)源:Unsplash
作者丨徐賢軍
來(lái)源丨徐賢軍 架構(gòu)師技術(shù)聯(lián)盟
如需轉(zhuǎn)載,請(qǐng)聯(lián)系原作者授權(quán)
隨著業(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)演變兩部分介紹:
系統(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)行讀寫分離,數(shù)據(jù)庫(kù)其實(shí)是系統(tǒng)最應(yīng)該保護(hù)的資源。
2.
>>>垂直拆分<<<
垂直拆分才是真正開始拆分系統(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)崩潰問(wèn)題。
業(yè)務(wù)對(duì)應(yīng)的庫(kù)也會(huì)按照對(duì)應(yīng)的業(yè)務(wù)拆分出用戶庫(kù)、商品庫(kù)、交易庫(kù)等。
3.
>>>水平擴(kuò)展<<<
業(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à)格、庫(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ù)查詢并反寫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)拆分的最后是微服務(wù),結(jié)構(gòu)的演變是技術(shù)的升級(jí)。
完
投稿啦!!!
精彩繼續(xù)
CSDN作為國(guó)內(nèi)專業(yè)的云計(jì)算服務(wù)平臺(tái),目前提供云計(jì)算、大數(shù)據(jù)、虛擬化、數(shù)據(jù)中心、OpenStack、CloudStack、機(jī)器學(xué)習(xí)、智能算法等相關(guān)云計(jì)算觀點(diǎn)、技術(shù)、平臺(tái)、實(shí)踐、云產(chǎn)業(yè)咨詢等服務(wù)。CSDN?公眾號(hào)也一直堅(jiān)持「與千萬(wàn)技術(shù)人共成長(zhǎng)」的理念,深度解讀行業(yè)內(nèi)熱門技術(shù)與場(chǎng)景應(yīng)用,致力于讓所有開發(fā)者保持敏銳的技術(shù)嗅覺、對(duì)行業(yè)趨勢(shì)與技術(shù)獲得更廣闊的認(rèn)知。
文章題材
首先你需要關(guān)注我們的公眾號(hào)“CSDN云計(jì)算”,這樣你會(huì)更準(zhǔn)確了解我們需要的文章風(fēng)格;
側(cè)重于云計(jì)算領(lǐng)域相關(guān)的文章,可以是技術(shù)、運(yùn)維、趨勢(shì)等方面的務(wù)實(shí)內(nèi)容;
原創(chuàng),要求文章有鮮明觀點(diǎn)和看法。
投稿須知
?稿費(fèi):根據(jù)原創(chuàng)性、實(shí)用性和時(shí)效性等方面進(jìn)行審核,通過(guò)的文章會(huì)發(fā)布在本微信平臺(tái)。一經(jīng)采用,我們將支付作者酬勞。酬勞可能不多,這代表的是一個(gè)心意,更多是因?yàn)閻酆?#xff0c;是有識(shí)之士抒發(fā)胸懷的一種方式;
字?jǐn)?shù)要求:稿件字?jǐn)?shù)以2K-8K為宜,少于2K或多于8K都會(huì)一定程度降低閱讀愉悅感;
投稿郵箱:lijy@csdn.net。或者添加微信表明來(lái)意,微信號(hào):tangguoyemeng。請(qǐng)備注投稿+姓名+公司職位。
如果咱們的合作穩(wěn)定又愉快,還可以簽訂合同長(zhǎng)期合作哦!
總結(jié)
以上是生活随笔為你收集整理的如何让笨重的系统架构变灵巧?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 刃为什么杀丹恒
- 下一篇: java信息管理系统总结_java实现科