架構(gòu)定義
什么是架構(gòu)
一直以來,在軟件行業(yè),對(duì)于什么是架構(gòu),都有很多的爭論,每個(gè)人都有自己的理解。為了準(zhǔn)確的理解架構(gòu),我們將和架構(gòu)有關(guān)系而且相似的幾個(gè)概念進(jìn)行梳理:
系統(tǒng)(system):泛指由一群有關(guān)聯(lián)的個(gè)體組成,根據(jù)某種規(guī)則運(yùn)作,能完成個(gè)別元件不能單獨(dú)完成的工作的群體。系統(tǒng)分為自然系統(tǒng)與人為系統(tǒng)兩大類。
模塊(Module):是一套一致而互相有緊密關(guān)連的軟件組織。它分別包含了程序和數(shù)據(jù)結(jié)構(gòu)兩部分。
組件(Component):自包含的、可編程的、可重用的、與語言無關(guān)的軟件單元,軟件組件可以很容易被用于組裝應(yīng)用程序中。
軟件框架(Software Framework),通常指的是為了實(shí)現(xiàn)某個(gè)業(yè)界標(biāo)準(zhǔn)或完成特定基本任務(wù)的軟件組件規(guī)范,也指為了實(shí)現(xiàn)某個(gè)軟件組件規(guī)范時(shí),提供規(guī)范所要求之基礎(chǔ)功能的軟件產(chǎn)品。
維基百科對(duì)于軟件架構(gòu)的定義:軟件架構(gòu)( Software Architecture)是有關(guān)軟件整體結(jié)構(gòu)與組件的抽象描述,用于指導(dǎo)大型軟件系統(tǒng)各個(gè)方面的設(shè)計(jì)。
我比較認(rèn)可的軟件架構(gòu)定義如下:軟件架構(gòu)定義了軟件有哪些組件,模塊,框架組成,以及他們是怎么交互了連通,體現(xiàn)了軟件的其他非功能特性,例如擴(kuò)展性,可維護(hù)性。
架構(gòu)目的
從這個(gè)定義上看,也不是很清晰。為了講清楚這個(gè)問題,我們先來看看為什么會(huì)產(chǎn)生架構(gòu)。從軟件開發(fā)進(jìn)化的歷史,探索一下軟件架構(gòu)出現(xiàn)的歷史背景。
機(jī)器語言(1940 年之前):直接使用二進(jìn)制碼 0 和 1 來表示機(jī)器可以識(shí)別的指令和數(shù)據(jù),主要問題是三難:太難寫、太難讀、太難改!
匯編語言(20 世紀(jì) 40 年代):為了解決機(jī)器語言編寫、閱讀、修改復(fù)雜的問題,匯編語言應(yīng)運(yùn)而生。但是本身編寫復(fù)雜,同時(shí)還要考慮不同 CPU 的匯編指令和結(jié)構(gòu)是不同的。
高級(jí)語言(20 世紀(jì) 50 年代):這些語言讓程序員不需要關(guān)注機(jī)器底層的低級(jí)結(jié)構(gòu)和邏輯,而只要關(guān)注具體的問題和業(yè)務(wù)即可。
第一次軟件危機(jī)與結(jié)構(gòu)化程序設(shè)計(jì)(20 世紀(jì) 60 年代~20 世紀(jì) 70 年代) :高級(jí)語言的出現(xiàn),解放了程序員,但好景不長,隨著軟件的規(guī)模和復(fù)雜度的大大增加,20 世紀(jì) 60 年代中期開始爆發(fā)了第一次軟件危機(jī),典型表現(xiàn)有軟件質(zhì)量低下、項(xiàng)目無法如期完成、項(xiàng)目嚴(yán)重超支等,因?yàn)檐浖鴮?dǎo)致的重大事故時(shí)有發(fā)生。為了解決問題,“結(jié)構(gòu)化程序設(shè)計(jì)”被提了出來。結(jié)構(gòu)化程序設(shè)計(jì)本質(zhì)上還是一種面向過程的設(shè)計(jì)思想,但通過“自頂向下、逐步細(xì)化、模塊化”的方法,將軟件的復(fù)雜度控制在一定范圍內(nèi),從而從整體上降低了軟件開發(fā)的復(fù)雜度。
第二次軟件危機(jī)與面向?qū)ο螅旱诙诬浖C(jī)主要體現(xiàn)在軟件的“擴(kuò)展”變得非常復(fù)雜。結(jié)構(gòu)化程序設(shè)計(jì)雖然能夠解決(也許用“緩解”更合適)軟件邏輯的復(fù)雜性,但是對(duì)于業(yè)務(wù)變化帶來的軟件擴(kuò)展卻無能為力,軟件領(lǐng)域迫切希望找到新的銀彈來解決軟件危機(jī),在這種背景下,面向?qū)ο蟮乃枷腴_始流行起來。雖然面向?qū)ο箝_始也被當(dāng)作解決軟件危機(jī)的銀彈,但事實(shí)證明,和軟件工程一樣,面向?qū)ο笠膊皇倾y彈,而只是一種新的軟件方法而已。
軟件架構(gòu):軟件架構(gòu)的出現(xiàn)有其歷史必然性。到了 20 世紀(jì) 90 年代“軟件架構(gòu)”開始流行,創(chuàng)造了“組件”概念。我們可以看到,“模塊”“對(duì)象”“組件”本質(zhì)上都是對(duì)達(dá)到一定規(guī)模的軟件進(jìn)行拆分,差別只是在于隨著軟件的復(fù)雜度不斷增加,拆分的粒度越來越粗,拆分的層次越來越高。
架構(gòu)設(shè)計(jì)的目的:為了解決復(fù)雜度帶來的問題
架構(gòu)復(fù)雜度來源
高性能
軟件系統(tǒng)中高性能帶來的復(fù)雜度主要體現(xiàn)在兩方面,一方面是單臺(tái)計(jì)算機(jī)內(nèi)部為了高性能帶來的復(fù)雜度;另一方面是多臺(tái)計(jì)算機(jī)集群為了高性能帶來的復(fù)雜度。
- 提高單機(jī)性。針對(duì)單臺(tái)計(jì)算機(jī),通過升級(jí)軟、硬件能力實(shí)現(xiàn)性能提升。例如增大內(nèi)存減少I/O操作(更換為固態(tài)硬盤(SSD)提升I/O訪問速度、使用RAID增加I/O吞吐能力)。能常見的技術(shù)點(diǎn):多進(jìn)程,多線程,進(jìn)程間通信,并發(fā)。常見的服務(wù)器體系結(jié)構(gòu),SMP (Symmetric Multiprocessing) , 對(duì)稱多處理器、NUMA ( Non-Uniform Memory Access),非均勻訪問存儲(chǔ)模型、MPP (Massively ParallelProcessing),海量并行處理架構(gòu)。
- 提高集群性能。利用合理的任務(wù)分配與任務(wù)分解實(shí)現(xiàn)性能的提升.常見的技術(shù)點(diǎn):分配算法,負(fù)載均衡,系統(tǒng)拆分。
高可用
高可用是指系統(tǒng)無中斷地執(zhí)行其功能的能力,代表系統(tǒng)的可用性程度,本質(zhì)是通過“冗余”來實(shí)現(xiàn)。常見高可用類型包括計(jì)算高可用,存儲(chǔ)高可用。
可擴(kuò)展性
可擴(kuò)展性指系統(tǒng)為了應(yīng)對(duì)將來需求變化而提供的一種擴(kuò)展能力,當(dāng)有新的需求出現(xiàn)時(shí),系統(tǒng)不需要或者僅需要少量修改就可以支持,無須整個(gè)系統(tǒng)重構(gòu)或者重建。由于軟件系統(tǒng)固有的多變性,新的需求總會(huì)不斷提出來,因此可擴(kuò)展性顯得尤其重要。對(duì)架構(gòu)師要求:
- 預(yù)測(cè)變化:如何把握預(yù)測(cè)的準(zhǔn)確性比較復(fù)雜,沒有固定的標(biāo)準(zhǔn),靠直覺和經(jīng)驗(yàn)。
- 應(yīng)對(duì)變化:技術(shù)上做到開閉原則,如何對(duì)擴(kuò)展開放付對(duì)修改關(guān)閉,抽象出穩(wěn)定和變化。
低成本
低成本可以是人力成本,服務(wù)器成本。低成本給架構(gòu)設(shè)計(jì)帶來的主要復(fù)雜度體現(xiàn)在,往往只有“創(chuàng)新”才能達(dá)到低成本目標(biāo)。這里的“創(chuàng)新”既包括開創(chuàng)一個(gè)全新的技術(shù)領(lǐng)域(這個(gè)要求對(duì)絕大部分公司太高),也包括引入新技術(shù),如果沒有找到能夠解決自己問題的新技術(shù),那么就真的需要自己創(chuàng)造新技術(shù)了。
安全
安全本身是一個(gè)龐大而又復(fù)雜的技術(shù)領(lǐng)域,并且一旦出問題,對(duì)業(yè)務(wù)和企業(yè)形象影響非常大。
從技術(shù)的角度來講,安全可以分為兩類:
一類是功能上的安全;功能安全其實(shí)就是“防小偷”,本質(zhì)上是因?yàn)橄到y(tǒng)實(shí)現(xiàn)有漏洞。常見的安全問題,例如:常見的XSS攻擊、CSRF攻擊、SQL注入等。
另一類是架構(gòu)上的安全。如果說“功能安全”是為了防小偷,那么架構(gòu)安全就是為了防強(qiáng)盜。
規(guī)模
規(guī)模帶來的復(fù)雜度主要原因在于“量變引起質(zhì)變”,當(dāng)數(shù)量超過一定閾值后,復(fù)雜度會(huì)發(fā)生質(zhì)的變化。常見的規(guī)模帶來的復(fù)雜度有:
- 功能越來越多,導(dǎo)致系統(tǒng)的復(fù)雜度指數(shù)越來越高;
- 數(shù)據(jù)越來越多,系統(tǒng)的復(fù)雜度發(fā)生質(zhì)變;
架構(gòu)原則
合適原則
合適原則,合適優(yōu)于業(yè)界領(lǐng)先。真正優(yōu)秀的架構(gòu)都是在企業(yè)當(dāng)前人力、條件、業(yè)務(wù)等各種約束下設(shè)計(jì)出來的,能夠合理地將資源整合在一起并發(fā)揮出最大功效,并且能夠快速落地,不要面向簡歷去設(shè)計(jì)架構(gòu),高大上的架構(gòu)不等于適用。
簡單原則
簡單原則,簡單優(yōu)于復(fù)雜。面對(duì)系統(tǒng)結(jié)構(gòu)、業(yè)務(wù)邏輯和復(fù)雜性,我們可以編寫出復(fù)雜的系統(tǒng),但在軟件領(lǐng)域,復(fù)雜代表的是“問題”。架構(gòu)設(shè)計(jì)時(shí)如果簡單的方案和復(fù)雜的方案都可以滿足需求,最好選擇簡單的方案。其實(shí),簡單比復(fù)雜更加困難。
演化原則
演化原則,演化優(yōu)于一步到位。業(yè)務(wù)在發(fā)展、技術(shù)在創(chuàng)新、外部環(huán)境在變化,這一切都是在告誡架構(gòu)師不要貪大求全,或者盲目照搬大公司的做法。應(yīng)該認(rèn)真分析當(dāng)前業(yè)務(wù)的特點(diǎn),明確業(yè)務(wù)面臨的主要問題,設(shè)計(jì)合理的架構(gòu),快速落地以滿足業(yè)務(wù)需要,然后在運(yùn)行過程中不斷完善架構(gòu),不斷隨著業(yè)務(wù)演化架構(gòu)。
架構(gòu)設(shè)計(jì)流程
識(shí)別復(fù)雜度
識(shí)別復(fù)雜度主要的復(fù)雜度問題列出來,然后根據(jù)業(yè)務(wù)、技術(shù)、團(tuán)隊(duì)等綜合情況進(jìn)行排序,優(yōu)先解決當(dāng)前面臨的最主要的復(fù)雜度問題。
(1)構(gòu)建復(fù)雜度的來源清單——高性能、可用性、擴(kuò)展性、安全、低成本、規(guī)模等。
(2)結(jié)合需求、技術(shù)、團(tuán)隊(duì)、資源等對(duì)上述復(fù)雜度逐一分析是否需要?是否關(guān)鍵? “高性能”主要從軟件系統(tǒng)未來的TPS、響應(yīng)時(shí)間、服務(wù)器資源利用率等客觀指標(biāo),也可以從用戶的主觀感受方面去考慮。 “可用性”主要從服務(wù)不中斷等質(zhì)量方面去考慮。 “擴(kuò)展性”則主要從功能需求的未來變更幅度等方面去考慮。
(3)按照上述的分析結(jié)論,得到復(fù)雜度按照優(yōu)先級(jí)的排序清單,越是排在前面的復(fù)雜度,就越關(guān)鍵,就越優(yōu)先解決。
設(shè)計(jì)備選方案
確定了系統(tǒng)面臨的主要復(fù)雜度問題后,方案設(shè)計(jì)就有了明確的目標(biāo),我們就可以開始真正進(jìn)行架構(gòu)方案設(shè)計(jì)了
架構(gòu)設(shè)計(jì)備選方案的工作更多的是從需求、團(tuán)隊(duì)、技術(shù)、資源等綜合情況出發(fā),對(duì)主流、成熟的架構(gòu)模式進(jìn)行選擇、組合、調(diào)整、創(chuàng)新。
(1)根據(jù)自己的經(jīng)驗(yàn)設(shè)計(jì)一個(gè)方案。因?yàn)榭蛇x的模式有很多,組合的方案更多,往往一個(gè)問題的解決方案有很多個(gè);如果再在組合的方案上進(jìn)行一些創(chuàng)新,解決方案會(huì)更多。簡單原則,適合原則。
(2)看看業(yè)界優(yōu)秀的方案是什么,和我們業(yè)務(wù)場(chǎng)景比較,比較關(guān)鍵復(fù)雜度問題
(3)設(shè)計(jì)多個(gè)備選方案,3-5個(gè)左右,備選方案有差異,
評(píng)估和選擇備選方案
列出我們需要關(guān)注的質(zhì)量屬性點(diǎn),然后分別從這些質(zhì)量屬性的維度去評(píng)估每個(gè)方案,再綜合挑選適合當(dāng)時(shí)情況的最優(yōu)方案。質(zhì)量屬性按照優(yōu)先級(jí)排序,首先挑選滿足第一優(yōu)先級(jí)的,如果方案都滿足,那就再看第二優(yōu)先級(jí)……以此類推。不要糾結(jié),當(dāng)差不多的時(shí)候,先落地比爭論搖擺要強(qiáng)
詳細(xì)方案設(shè)計(jì)
詳細(xì)方案設(shè)計(jì)就是將方案涉及的關(guān)鍵技術(shù)細(xì)節(jié)給確定下來。
架構(gòu)模式實(shí)戰(zhàn)
高性能架構(gòu)模式
存儲(chǔ)高性能
關(guān)系型數(shù)據(jù)庫。單個(gè)數(shù)據(jù)庫無法滿足業(yè)務(wù)需要,必須考慮數(shù)據(jù)庫集群的方式。高性能數(shù)據(jù)庫集群的第一種方式“讀寫分離”,將訪問的壓力分散到集群的多個(gè)節(jié)點(diǎn)上去。第二種方式“分庫分表”分散訪問壓力,分散存儲(chǔ)壓力。常見的開源框架:淘寶TDDL,360的Atlas。
高性能NOSQL:常見的NoSQL 方案有如下4 類:
- K-V 存儲(chǔ):解決關(guān)系數(shù)據(jù)庫無法存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)的問題,以redis 為代表。
- 文檔數(shù)據(jù)庫:解決關(guān)系數(shù)據(jù)庫強(qiáng)schema 約束的問題,以MongoDB 為代表。
- 列式數(shù)據(jù)庫: 解決關(guān)系數(shù)據(jù)庫大數(shù)據(jù)場(chǎng)景下的I/O 問題,以HBase 為代表。
- 全文搜索引擎:解決關(guān)系數(shù)據(jù)庫的全文搜索性能問題,以Elasticsearch 為代表。
緩存:緩存就是為了彌補(bǔ)存儲(chǔ)系統(tǒng)在這些復(fù)雜業(yè)務(wù)場(chǎng)景下的不足,其基本原理是將可能重復(fù)使用的數(shù)據(jù)放到內(nèi)存中,一次生成、多次使用,避免每次使用都去訪問存儲(chǔ)系統(tǒng)。緩存常見問題有緩存雪崩、緩存穿透、緩存預(yù)熱、緩存熱點(diǎn)等。
- 緩存雪崩是指當(dāng)緩存失效(過期)后引起系統(tǒng)性能急劇下降的情況。
- 緩存穿透是指緩存沒有發(fā)揮作用,業(yè)務(wù)系統(tǒng)雖然去 查緩存,但沒有命中,就需要再次去存儲(chǔ)系統(tǒng)查詢數(shù)據(jù)。
- 緩存預(yù)熱(warm up)指系統(tǒng)上線后,將相關(guān)的緩存數(shù)據(jù)直接加載到緩存系統(tǒng),而不是等待用戶訪問才來觸發(fā)緩存加載。
- 緩存熱點(diǎn):對(duì)于一些特別熱點(diǎn)的數(shù)據(jù),如果大部分甚至所有的業(yè)務(wù)請(qǐng)求都命中同一份緩存數(shù)據(jù),則這份數(shù)據(jù)所在的緩存服務(wù)器的壓力也很大
計(jì)算高性能
計(jì)算高性能主要集中在兩方面:
(1 )盡量提升單服務(wù)器的性能,將單服務(wù)器的性能發(fā)揮到極致。
(2 )如果單服務(wù)器無法支撐性能,設(shè)計(jì)服務(wù)器集群方案。
單機(jī)服務(wù)器高性能。單機(jī)高性能關(guān)鍵之一網(wǎng)絡(luò)編程模型涉及到兩個(gè)關(guān)鍵點(diǎn):I/O 模型和進(jìn)程模型
- I/0 模型:阻塞、非阻塞、同步、異步。
- 進(jìn)程模型:單進(jìn)程、多進(jìn)程、多線程 PPC,TPC,Reactor,Proactor
集群高性能。高性能集群的本質(zhì)很簡單,通過增加更多的服務(wù)器來提升系統(tǒng)整體的計(jì)算能力。高性能集群的復(fù)雜性主要體現(xiàn)在負(fù)載均衡和分配算法。
- 負(fù)載均衡:常用的負(fù)載均衡系統(tǒng)包括3種:DNS負(fù)載均衡、硬件負(fù)載均衡和軟件負(fù)載均衡。DNS負(fù)載均衡實(shí)現(xiàn)簡單、成本低,但也存在粒度太粗、負(fù)載均衡算法少等缺點(diǎn)。軟件和硬件的最主要區(qū)別就在于性能,硬件負(fù)載均衡性能遠(yuǎn)遠(yuǎn)高于軟件負(fù)載均衡性能。Nginx的性能是萬級(jí),一般的linux服務(wù)器上裝一個(gè)Nginx大概能到5萬/秒;LVS的性能是十萬級(jí),據(jù)說可達(dá)到80萬/秒;而F5性能是百萬級(jí),從200萬/秒到800萬/秒都有。
上述三種負(fù)載均衡的分類架構(gòu),各有自己的所長,其實(shí)可以遵循一個(gè)組合原則來使用它們。
- 負(fù)載均衡常見算法:
根據(jù)算法期望達(dá)到的目的,大體可以分為這么幾類:
(1)任務(wù)平分類:負(fù)載均衡系統(tǒng)將接收到的任務(wù)平均分配給服務(wù)器進(jìn)行處理
(2)負(fù)載均衡類:負(fù)載均衡系統(tǒng)根據(jù)服務(wù)器的負(fù)載來進(jìn)行分配,
(3)性能最優(yōu)類:負(fù)載均衡系統(tǒng)根據(jù)服務(wù)器的響應(yīng)時(shí)間來進(jìn)行任務(wù)分配
(4)Hash類:負(fù)載均衡系統(tǒng)根據(jù)任務(wù)中的某些關(guān)鍵信息進(jìn)行Hash運(yùn)算
高可用架構(gòu)模式
高可用架構(gòu)理論
CAP理論:在一個(gè)分布式系統(tǒng)(指互相連接并共享數(shù)據(jù)的節(jié)點(diǎn)的集合)中,當(dāng)涉及讀寫操作時(shí),只能保證一致性(Consistence)、可用性(Availability)、 分區(qū)容錯(cuò)性(Partition Tolerance)三者中的兩個(gè),另外一個(gè)必須被犧牲。
可以注意上述描述中著重強(qiáng)調(diào)了兩點(diǎn):互相連接和共享數(shù)據(jù)。因?yàn)榉植际较到y(tǒng)并不一定會(huì)互聯(lián)和共享數(shù)據(jù),只有滿足這兩點(diǎn)的系統(tǒng)才符合CAP理論。CAP原理是忽略網(wǎng)絡(luò)延遲的。
BASE是Basically Available(基本可用)、SofState(軟狀態(tài))和Eventually Consistency(最終一致性)三個(gè)短語的縮寫,其核心思想是即使無法做到強(qiáng)一致性(CAP的一致性就是強(qiáng)一致性),但應(yīng)用可以采用適合的方式達(dá)到最終一致性(Eventual Consistency)。
當(dāng)談到數(shù)據(jù)一致性時(shí),CAP、ACID、BASE難免都會(huì)被拿出來進(jìn)行討論的,原因在于這三者都是和數(shù)據(jù)一致性相關(guān)的理論。ACID,數(shù)據(jù)庫事務(wù)的特性。CAP,分布式系統(tǒng)設(shè)計(jì)理論。BASE,也是分布式系統(tǒng)設(shè)計(jì)理論,延伸了CAP理論中AP方案。
FEMA分析方法
FMEA(Failure mode and effects analysis,故障模式與影響分析)又稱為失效模式與后果分析
FMEA 是一種在各行各業(yè)都有廣泛應(yīng)用的可用性分析方法,通過對(duì)系統(tǒng)范圍內(nèi)潛在的故障模式加以分析,并按照嚴(yán)重程度進(jìn)行分類,以確定失效對(duì)于系統(tǒng)的最終影響。
回到軟件架構(gòu)設(shè)計(jì)領(lǐng)域,F(xiàn)MEA 并不能指導(dǎo)我們?nèi)绾巫黾軜?gòu)設(shè)計(jì),而是當(dāng)我們?cè)O(shè)計(jì)出一個(gè)架構(gòu)后,再使用 FMEA 對(duì)這個(gè)架構(gòu)進(jìn)行分析,看看架構(gòu)是否還存在某些可用性的隱患。
在架構(gòu)設(shè)計(jì)領(lǐng)域,F(xiàn)MEA的具體分析方法如下:
- 給出初始的架構(gòu)圖
- 假設(shè)架構(gòu)中某個(gè)部件發(fā)生故障
- 分析此故障對(duì)系統(tǒng)功能的影響
- 根據(jù)分析結(jié)果,判斷架構(gòu)是否需要優(yōu)化。
存儲(chǔ)高可用
存儲(chǔ)高可用的本質(zhì)是通過將數(shù)據(jù)復(fù)制到多和存儲(chǔ)設(shè)備,通過數(shù)據(jù)的冗余方式來實(shí)現(xiàn)高可用。常見高可用存儲(chǔ)架構(gòu):主備(備庫只是一個(gè)備份),主從(主機(jī)負(fù)責(zé)讀寫,備庫可以用來讀),主主(都可以負(fù)責(zé)讀寫,保障數(shù)據(jù)能夠被雙向復(fù)制),數(shù)據(jù)分散集群(急群眾的每臺(tái)服務(wù)器會(huì)負(fù)責(zé)存儲(chǔ)一部分?jǐn)?shù)據(jù),同時(shí)也會(huì)備份一份數(shù)據(jù)),數(shù)據(jù)按照地理級(jí)別分區(qū)主備架構(gòu)一些復(fù)雜點(diǎn):主備狀態(tài)判斷(常見直連方式,中介方式,客戶端判斷),數(shù)據(jù)一致性。
在數(shù)據(jù)一致性中,常見技術(shù)有分布式事務(wù)例如 兩階段提交,三階段提交;一致性算法例如Paxos,Raft,ZAB。
計(jì)算高可用
計(jì)算高可用的主要設(shè)計(jì)目標(biāo)是當(dāng)出現(xiàn)部分硬件損壞時(shí),計(jì)算任務(wù)能夠繼續(xù)正常運(yùn)行。因此計(jì)算高可用的本質(zhì)是通過冗余來規(guī)避部分故障的風(fēng)險(xiǎn),單臺(tái)服務(wù)器是無論如何都達(dá)不到這個(gè)目標(biāo)的。所以計(jì)算高可用的設(shè)計(jì)思想很簡單:通過增加更多服務(wù)器來達(dá)到計(jì)算高可用。計(jì)算高可用架構(gòu)的設(shè)計(jì)復(fù)雜度主要體現(xiàn)在任務(wù)管理方面,即當(dāng)任務(wù)在某臺(tái)服務(wù)器上執(zhí)行失敗后,如何將任務(wù)重新分配到新的服務(wù)器進(jìn)行執(zhí)行。計(jì)算高可用架構(gòu):主備,計(jì)算集群。
業(yè)務(wù)高可用
從“異地多活”和“接口級(jí)別故障”兩個(gè)業(yè)務(wù)場(chǎng)景中,考慮如何保障業(yè)務(wù)高可用。
異地多活是指,正常情況下用戶無論訪問哪一個(gè)地點(diǎn)的業(yè)務(wù)系統(tǒng),都能夠得到正確的業(yè)務(wù)服務(wù);若某個(gè)地方業(yè)務(wù)異常的時(shí)候,用戶訪問其他不同地理位置正常的業(yè)務(wù)系統(tǒng),也能夠得到正確的業(yè)務(wù)服務(wù)。
異地多活架構(gòu)設(shè)計(jì)是為了應(yīng)對(duì)在一些極端場(chǎng)景下,服務(wù)器出現(xiàn)故障如機(jī)房斷電、地震等等。但是,要實(shí)現(xiàn)異地多活的代價(jià)比較高,一方面系統(tǒng)的復(fù)雜度會(huì)變變高;另一方面,系統(tǒng)實(shí)現(xiàn)的成本也會(huì)變高。
設(shè)計(jì)技巧:異地多活設(shè)計(jì)技巧:保證核心業(yè)務(wù)的異地多活、保證核心數(shù)據(jù)最終一致性、采用多種手段同步數(shù)據(jù)、只保證絕大部分用戶的異地多活。
異地多活方案主要針對(duì)系統(tǒng)級(jí)別的故障,而接口級(jí)別故障,顧名思義就是針對(duì)接口級(jí)別的故障。其典型表現(xiàn)就是,系統(tǒng)沒有宕機(jī)、網(wǎng)絡(luò)沒有中斷,但是業(yè)務(wù)出現(xiàn)問題。內(nèi)部可能是程序bug問題,外部可能是黑客攻擊、大量請(qǐng)求訪問等等。解決辦法一般分為三種:降級(jí)、熔斷、限流、排隊(duì)。
可擴(kuò)展架構(gòu)模式
軟件系統(tǒng)與硬件和建筑系統(tǒng)最大的差異在于軟件是可擴(kuò)展的,一個(gè)硬件生產(chǎn)出來后就不會(huì)再進(jìn)行改變。而我們需要不斷地讓軟件系統(tǒng)具備更多的功能和特性,滿足新的需求或者順應(yīng)技術(shù)發(fā)展的趨勢(shì)。
如何避免擴(kuò)展時(shí)改動(dòng)范圍太大,是軟件架構(gòu)可擴(kuò)展性設(shè)計(jì)的主要思考點(diǎn)。可擴(kuò)展架構(gòu)的基本思想就是:“拆”。就是將原本大一統(tǒng)的系統(tǒng)拆分成多個(gè)規(guī)模小的部分,擴(kuò)展時(shí)只修改其中一部分即可,無須整個(gè)系統(tǒng)到處都改。
可以減少改動(dòng)范圍,降低改動(dòng)風(fēng)險(xiǎn)。3種拆分思路,面向流程拆分、面向服務(wù)拆分、面向功能拆分。
1.面向流程拆分:將整個(gè)業(yè)務(wù)流程拆分為幾個(gè)階段,每個(gè)階段作為一部分。面向流程拆分:展示層--》業(yè)務(wù)層--》數(shù)據(jù)層--》存儲(chǔ)層

2.面向服務(wù)拆分:將系統(tǒng)提供的服務(wù)拆分,每個(gè)服務(wù)作為一部分。面向服務(wù)拆分:注冊(cè)服務(wù)、登錄服務(wù)、信息管理服務(wù)、安全設(shè)置服務(wù)。

3.面向功能拆分:將系統(tǒng)提供的功能拆分,每個(gè)功能作為一部分。面向功能拆分:手機(jī)號(hào)注冊(cè)、郵箱注冊(cè)、手機(jī)號(hào)登錄、郵箱登錄、課程信息管理、成績信息管理、修改密碼、找回密碼。

面向流程拆分:分層架構(gòu)
分層架構(gòu)是很常見的架構(gòu)模式,它也叫 N 層架構(gòu),通常情況下,N 至少是 2 層。例如,C/S 架構(gòu)、B/S 架構(gòu)。常見的是 3 層架構(gòu)(例如,MVC、MVP 架構(gòu))、4 層架構(gòu),5 層架構(gòu)的比較少見,一般是比較復(fù)雜的系統(tǒng)才會(huì)達(dá)到或者超過 5 層,比如操作系統(tǒng)內(nèi)核架構(gòu)。
無論采取何種分層維度,分層架構(gòu)設(shè)計(jì)最核心的一點(diǎn)就是需要保證各層之間的差異足夠清晰,邊界足夠明顯,讓人看到架構(gòu)圖后就能看懂整個(gè)架構(gòu),這也是分層不能分太多層的原因。
分層架構(gòu)另外一個(gè)典型的缺點(diǎn)就是性能,因?yàn)槊恳淮螛I(yè)務(wù)請(qǐng)求都需要穿越所有的架構(gòu)分層。
面向服務(wù)拆分:SOA、微服務(wù)
SOA 的全稱是 Service Oriented Architecture,中文翻譯為“面向服務(wù)的架構(gòu)”。為了應(yīng)對(duì)傳統(tǒng) IT 系統(tǒng)存在的問題,SOA 提出了 3 個(gè)關(guān)鍵概念。ESB:ESB 的全稱是 Enterprise Service Bus。松耦合:松耦合的目的是減少各個(gè)服務(wù)間的依賴和互相影響。服務(wù):所有業(yè)務(wù)功能都是一項(xiàng)服務(wù)。
微服務(wù)架構(gòu)(Microservice Architecture)是一種架構(gòu)概念,微服務(wù)架構(gòu)是一種將單應(yīng)用程序作為一套小型服務(wù)開發(fā)的方法,每種應(yīng)用程序都在其自己的進(jìn)程中運(yùn)行,并與輕量級(jí)機(jī)制(通常是HTTP資源的API)進(jìn)行通信。這些服務(wù)是圍繞業(yè)務(wù)功能構(gòu)建的,可以通過全自動(dòng)部署機(jī)制進(jìn)行獨(dú)立部署。這些服務(wù)的集中化管理已經(jīng)是最少的,它們可以用不同的編程語言編寫,并使用不同的數(shù)據(jù)存儲(chǔ)技術(shù)。
SOA 和微服務(wù)本質(zhì)上是兩種不同的架構(gòu)設(shè)計(jì)理念,只是在“服務(wù)”這個(gè)點(diǎn)上有交集而已。


微服務(wù)具體有哪些坑:
- 服務(wù)劃分過細(xì),服務(wù)間關(guān)系復(fù)雜
- 服務(wù)數(shù)量太多,團(tuán)隊(duì)效率急劇下降
- 調(diào)用鏈太長,性能下降
- 調(diào)用鏈太長,問題定位困難
- 沒有自動(dòng)化支撐,無法快速交付
- 沒有服務(wù)治理,微服務(wù)數(shù)量多了后管理混亂
微服務(wù)架構(gòu)最佳實(shí)踐:
服務(wù)粒度:“三個(gè)火槍手”原則,即一個(gè)微服務(wù)三個(gè)人負(fù)責(zé)開發(fā)。“三個(gè)火槍手”的原則主要應(yīng)用于微服務(wù)設(shè)計(jì)和開發(fā)階段,如果微服務(wù)經(jīng)過一段時(shí)間發(fā)展后已經(jīng)比較穩(wěn)定,處于維護(hù)期了,無須太多的開發(fā),那么平均 1 個(gè)人維護(hù) 1 個(gè)微服務(wù)甚至幾個(gè)微服務(wù)都可以。當(dāng)然考慮到人員備份問題,每個(gè)微服務(wù)最好都安排 2 個(gè)人維護(hù),每個(gè)人都可以維護(hù)多個(gè)微服務(wù)。
拆分方法:基于業(yè)務(wù)邏輯拆分,基于可靠性拆分,基于性能拆分,基于可擴(kuò)展拆分(將系統(tǒng)中的業(yè)務(wù)模塊按照穩(wěn)定性排序,將已經(jīng)成熟和改動(dòng)不大的服務(wù)拆分為穩(wěn)定服務(wù),將經(jīng)常變化和迭代的服務(wù)拆分為變動(dòng)服務(wù))
面向功能拆分:微內(nèi)核架構(gòu)
微內(nèi)核架構(gòu)(Microkernel architecture)模式也被稱為插件架構(gòu)(plugin architecture)模式。可以用來實(shí)現(xiàn)基于產(chǎn)品的應(yīng)用, 比如Eclipse,在微內(nèi)核的基礎(chǔ)上添加一些插件,就可以提供不同的產(chǎn)品,如C++, JAVA等。
微內(nèi)核包含兩個(gè)組件: core system 和 plug-in modules。應(yīng)用邏輯被分隔成核心系統(tǒng)和插件模塊,可以提供可擴(kuò)展的,靈活的,特性隔離的功能。

微內(nèi)核的架構(gòu)本質(zhì)就是將變化部分封裝在插件里面,從而達(dá)到快速靈活擴(kuò)展的目的,而又不影響整體系統(tǒng)的穩(wěn)定。
微內(nèi)核的核心系統(tǒng)設(shè)計(jì)的關(guān)鍵技術(shù)有:插件管理(有哪些插件,怎么加載,什么時(shí)候加載)、插件連接(插件怎么連接到核心系統(tǒng))和插件通信(插件之間的通信)。相關(guān)框架技術(shù):OSGi 的全稱是 Open Services Gateway initiative。
軟件可擴(kuò)展性方法總結(jié):
- 思想:拆分。開放/關(guān)閉原則:軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開放,但對(duì)修改關(guān)閉。單一職責(zé)原則:一個(gè)類應(yīng)該只有一個(gè)職責(zé)依賴倒置原則:依賴抽象
- 方法:面向?qū)ο蠓椒ā⒉鸱址椒?/li>
- 實(shí)戰(zhàn)模式:設(shè)計(jì)模式、架構(gòu)模式、技術(shù)框架
互聯(lián)網(wǎng)標(biāo)準(zhǔn)技術(shù)架構(gòu)圖
架構(gòu)圖如下圖所示。這張圖基本涵蓋了互聯(lián)網(wǎng)技術(shù)公司的大部分技術(shù)點(diǎn),不同公司只是在具體的技術(shù)實(shí)現(xiàn)上稍有差異,但不會(huì)跳出這個(gè)框架的范疇。
