設(shè)計(jì)一個(gè)系統(tǒng)的過(guò)程,就是建造一座大廈的過(guò)程,架構(gòu)設(shè)計(jì)的質(zhì)量直接決定了大廈的質(zhì)量。
在我們進(jìn)行系統(tǒng)的架構(gòu)設(shè)計(jì)時(shí),總是會(huì)遇到一系列的問(wèn)題,比如一個(gè)大型系統(tǒng)的架構(gòu)應(yīng)該如何起步,從哪里開(kāi)始設(shè)計(jì)?系統(tǒng)是否應(yīng)該劃分成多個(gè)模塊,應(yīng)該怎么劃分模塊才更加的合理?亦或是覺(jué)得產(chǎn)品提出的需求非常不合理,完全影響我們正常的架構(gòu)設(shè)計(jì)!對(duì)于非功能性的需求,我們是否可以得過(guò)且過(guò),不去重視?
這些問(wèn)題,讓我們?cè)趧傞_(kāi)始架構(gòu)設(shè)計(jì)時(shí)手足無(wú)措,但是隨著我們完成一個(gè)又一個(gè)的系統(tǒng)架構(gòu)設(shè)計(jì)以后,發(fā)現(xiàn)架構(gòu)設(shè)計(jì)是有章法可循的,只要我們學(xué)習(xí)這些章法和套路,并且在工作過(guò)程中不斷的積累與沉淀,就會(huì)行成一個(gè)完整的架構(gòu)設(shè)計(jì)方法論,面對(duì)新的大型系統(tǒng)架構(gòu)設(shè)計(jì),也會(huì)一步一步有節(jié)奏進(jìn)行,最終完成整體的架構(gòu)設(shè)計(jì)。
架構(gòu)設(shè)計(jì)的原則
架構(gòu)設(shè)計(jì)需要遵循一些原則:
1、架構(gòu)設(shè)計(jì)需要方法體系
架構(gòu)設(shè)計(jì)并不是一個(gè)” 單一的方法 “,直接拿來(lái)進(jìn)行架構(gòu)設(shè)計(jì),而是多個(gè)各具特色的方法,組成的 “方法體系”,并且這個(gè)體系隨著新技術(shù)的發(fā)展還會(huì)不斷進(jìn)化。
2、架構(gòu)設(shè)計(jì)是質(zhì)疑驅(qū)動(dòng)
架構(gòu)設(shè)計(jì)是質(zhì)疑驅(qū)動(dòng)的過(guò)程,在” 需求驅(qū)動(dòng) “的基礎(chǔ)上,我們需要不斷的質(zhì)疑我們架構(gòu)設(shè)計(jì)的中間成果,進(jìn)一步通過(guò) “質(zhì)疑”,引入更多的 “質(zhì)量屬性” 及更多 “功能場(chǎng)景”。
3、多階段下的多視圖
架構(gòu)設(shè)計(jì),是多階段還是多視圖?架構(gòu)設(shè)計(jì)首先是 “多階段的”,我們將架構(gòu)設(shè)計(jì)劃分成多個(gè)階段,在每個(gè)階段中才會(huì)考慮” 視圖 “這個(gè)維度。
架構(gòu)設(shè)計(jì)的三個(gè)階段
階段一、 預(yù)備階段
預(yù)備階段的目標(biāo):全面理解需求,把握需求特點(diǎn),確定架構(gòu)設(shè)計(jì)驅(qū)動(dòng)力。
在預(yù)備階段,我們需要全面的梳理與理解需求,不放過(guò)任何一個(gè)需求細(xì)節(jié)。同時(shí)分析需求產(chǎn)生的各項(xiàng)質(zhì)量屬性與系統(tǒng)約束,同時(shí)兼顧這些約束進(jìn)行架構(gòu)設(shè)計(jì),才能不遺漏重大的架構(gòu)屬性。
階段二、 概念架構(gòu)
概念架構(gòu),必須考慮包括功能,質(zhì)量,約束在內(nèi)的所有方面的需求。
階段三、 細(xì)化架構(gòu)
在細(xì)化架構(gòu)階段,我們從五個(gè)不同的角度出發(fā),設(shè)計(jì)五個(gè)視圖,完成整個(gè)系統(tǒng)全方位的設(shè)計(jì)。
架構(gòu)設(shè)計(jì)的一個(gè)貫穿環(huán)節(jié)
對(duì)非功能需求的考慮:非功能需求無(wú)法一蹴而就,因?yàn)樵谠O(shè)計(jì)的過(guò)程當(dāng)中,會(huì)有新的需求不斷的被發(fā)現(xiàn),即使設(shè)計(jì)完成,在開(kāi)發(fā)階段,都會(huì)有影響非功能需求的約束出現(xiàn),所以在整個(gè)階段,都應(yīng)該注意非功能需求。
預(yù)備架構(gòu)階段分析
預(yù)備架構(gòu)的最重要的目標(biāo),是建立需求大局觀,把握需求特點(diǎn),確定架構(gòu)設(shè)計(jì)驅(qū)動(dòng)力。通過(guò)對(duì)需求的詳細(xì)分析,有一個(gè)宏觀的需求感知,同時(shí)還要兼顧系統(tǒng)的質(zhì)量要求和約束對(duì)系統(tǒng)設(shè)計(jì)造成的制約條件。
需求結(jié)構(gòu)化
需求是有結(jié)構(gòu)的,而不是零散的需求點(diǎn),只有將分析后的需求結(jié)構(gòu)化,才能宏觀的感知整個(gè)需求。可以借助 ADMEMS 二維矩陣,將架構(gòu)影響因素,梳理脈絡(luò)。
例如以下矩陣分析,將需求劃分為多個(gè)維度,橫向上從” 廣義功能 “,” 質(zhì)量 “,” 約束 “三個(gè)方面分析,廣義功能是指需求需要滿足的基本功能,及產(chǎn)品或業(yè)務(wù)人員的直接要求。質(zhì)量維度則是系統(tǒng)設(shè)計(jì)時(shí)需要考慮的高并發(fā),高可用,可拓展等技術(shù)設(shè)計(jì)維護(hù),保證系統(tǒng)在滿足基本需求的同時(shí),同時(shí)對(duì)后續(xù)系統(tǒng)進(jìn)化發(fā)展以及極端場(chǎng)景(例如:用戶量激增,秒殺)等的滿足。約束則是系統(tǒng)設(shè)計(jì)時(shí)的一些制約,例如上線日期,上線環(huán)境,開(kāi)發(fā)人員技能水平等。縱向上劃分為” 業(yè)務(wù)級(jí)需求 “,” 用戶級(jí)需求 “,” 開(kāi)發(fā)級(jí)需求 “三個(gè)維護(hù),” 業(yè)務(wù)級(jí)需求 “是指產(chǎn)品或業(yè)務(wù)人員提出的基本要求,” 用戶級(jí)需求 “則是從系統(tǒng)的使用用戶角度出發(fā),發(fā)現(xiàn)的例如用戶電腦操作水平,用戶使用習(xí)慣等潛在需求,而” 開(kāi)發(fā)級(jí)需求 “,則是從研發(fā)人員角度出發(fā),發(fā)現(xiàn)的例如可拓展,可測(cè)試,技術(shù)環(huán)境等不同維度的需求。
通過(guò)將需求結(jié)構(gòu)化,我們可以全面的分析整體的需求,對(duì)需求進(jìn)行整體的理解,同時(shí)也可以從不同的角度發(fā)現(xiàn)系統(tǒng)制約條件,在系統(tǒng)設(shè)計(jì)的最開(kāi)始階段就著手設(shè)計(jì),防止遺漏重大約束導(dǎo)致架構(gòu)設(shè)計(jì)失敗。
分析約束影響
約束分析的幾個(gè)方面:
1、 來(lái)自產(chǎn)品或運(yùn)營(yíng)人員的約束性需求
系統(tǒng)的非功能需求,例如:上線時(shí)間,預(yù)算,工期要求等
業(yè)務(wù)領(lǐng)域相關(guān)的限制,例如業(yè)務(wù)規(guī)則或業(yè)務(wù)限制,相關(guān)法律,專利等。
2、 來(lái)自用戶的約束性需求
系統(tǒng)的用戶,同樣會(huì)產(chǎn)生約束性需求,比如用戶的計(jì)算機(jī)水平,年齡段,使用偏好,國(guó)家等。
例如用戶計(jì)算機(jī)水平整體較弱的話,在開(kāi)發(fā)交互方式時(shí)就不應(yīng)太過(guò)復(fù)雜,同時(shí)要兼顧系統(tǒng)的魯棒性,防止系統(tǒng)被用戶搞掛。
用戶使用產(chǎn)品時(shí)的外部環(huán)境同樣可能產(chǎn)生約束條件,比如訪問(wèn)環(huán)境是內(nèi)網(wǎng)或是外網(wǎng),則決定了系統(tǒng)提供訪問(wèn)鏈接不同的網(wǎng)絡(luò)權(quán)限。訪問(wèn)環(huán)境信號(hào)強(qiáng)度若,則系統(tǒng)的性能要求則更高。
3、 來(lái)自開(kāi)發(fā)或運(yùn)維人員的約束性需求
開(kāi)發(fā)團(tuán)隊(duì)的技術(shù)水平,磨合程度,同樣制約著系統(tǒng)的開(kāi)發(fā),如果開(kāi)發(fā)人員均是高級(jí)研發(fā)人員且對(duì)當(dāng)前技術(shù)棧有深入的了解,則開(kāi)發(fā)進(jìn)度就會(huì)更快,如果是新團(tuán)隊(duì),且需要對(duì)技術(shù)棧進(jìn)行學(xué)習(xí)才可以介入開(kāi)發(fā),則在工期或系統(tǒng)風(fēng)險(xiǎn)層面需要額外考慮。
4、 業(yè)界當(dāng)前技術(shù)環(huán)境
當(dāng)前技術(shù)環(huán)境中間件的成熟程度,編程語(yǔ)言及流行度,優(yōu)缺點(diǎn)等,都會(huì)對(duì)架構(gòu)設(shè)計(jì)產(chǎn)生約束條件。
約束的分類:
1、 直接約束
例如:系統(tǒng)運(yùn)行于 linux 平臺(tái)。
2、 轉(zhuǎn)換為功能需求的約束
對(duì)于這種約束,可以直接轉(zhuǎn)換為功能需求
例如:供應(yīng)商擁有自己的一套城市信息表 -> 引出的功能需求:需要進(jìn)行城市轉(zhuǎn)換
例如:供應(yīng)商服務(wù)器性能差,tps 最大 10 -> 引出的功能需求:需要進(jìn)行限流請(qǐng)求
3、 轉(zhuǎn)換為質(zhì)量屬性需求的約束
例如:系統(tǒng)使用者計(jì)算機(jī)水平不高
轉(zhuǎn)換為質(zhì)量屬性:易用性(否則不會(huì)用),魯棒性(系統(tǒng)被搞癱)
確定關(guān)鍵質(zhì)量
系統(tǒng)的關(guān)鍵質(zhì)量是需要進(jìn)行取舍的,需要確認(rèn)業(yè)務(wù)人員更注重那方面或在滿足需求的基礎(chǔ)上,確定哪些是必須的,哪些是可以適當(dāng)忽略的。
我們需要首先確定架構(gòu)重點(diǎn)支持哪些質(zhì)量屬性,然后對(duì)于相互矛盾的質(zhì)量屬性,進(jìn)行權(quán)衡折中。例如當(dāng)滿足性能這個(gè)質(zhì)量屬性時(shí),同時(shí)就會(huì)因?yàn)橐胄碌姆桨富蚪M件,導(dǎo)致可維護(hù)性,可測(cè)試性降低;提高可拓展性時(shí),就會(huì)對(duì)系統(tǒng)的性能和安全性產(chǎn)生影響等等,我們需要做的,就是在各個(gè)關(guān)鍵質(zhì)量中進(jìn)行取舍。
確定關(guān)鍵功能
確定關(guān)鍵功能的 4 個(gè)方面
1、 核心功能
2、 必做功能
3、 高風(fēng)險(xiǎn)功能
4、 獨(dú)特功能
其他常見(jiàn)系統(tǒng)不存在的功能
注意衍生需求:
從需求轉(zhuǎn)入設(shè)計(jì)時(shí),因方案制定過(guò)程的復(fù)雜,會(huì)產(chǎn)生大量的衍生需求,衍生需求是原始需求的數(shù)倍。
舉例:
原始需求:定時(shí)拉取供應(yīng)商數(shù)據(jù)。
衍生需求:
1、 由于供應(yīng)商數(shù)量較多,需要引入分布式定時(shí)任務(wù),集群并發(fā)拉取
2、 由于供應(yīng)商數(shù)據(jù)量大,需要分庫(kù)分表設(shè)計(jì)
3、需要快速搜索,引入存儲(chǔ)引擎組件等等
??這些衍生需求我們必須要考慮,雖然業(yè)務(wù)需求沒(méi)有體現(xiàn),但缺失架構(gòu)設(shè)計(jì)的關(guān)鍵影響因素。
架構(gòu)驅(qū)動(dòng)力對(duì)比:
業(yè)務(wù)需求驅(qū)動(dòng)架構(gòu):
??重大需求驅(qū)動(dòng)架構(gòu):
??由此可以看出,通過(guò)重大需求驅(qū)動(dòng)的架構(gòu),更能考慮到更關(guān)鍵的部分,設(shè)計(jì)的架構(gòu)更能滿足需求的要求,架構(gòu)設(shè)計(jì)成功的概率會(huì)更高。
概念架構(gòu)階段分析
概念架構(gòu)階段,對(duì)系統(tǒng)進(jìn)行適當(dāng)?shù)姆纸猓幌萑爰?xì)節(jié)
概念架構(gòu)的過(guò)程是,先根據(jù)關(guān)鍵功能進(jìn)行初步設(shè)計(jì),然后對(duì)設(shè)計(jì)的系統(tǒng)進(jìn)行高層分割,接下來(lái)考慮非功能性需求(關(guān)鍵質(zhì)量和約束),然后修改自己的初步設(shè)計(jì),循環(huán)往復(fù),在不斷的質(zhì)疑和優(yōu)化過(guò)程中,完善架構(gòu)設(shè)計(jì)。
初步設(shè)計(jì)
初步設(shè)計(jì)的目標(biāo)是發(fā)現(xiàn)職責(zé),無(wú)需展開(kāi)細(xì)節(jié)設(shè)計(jì)。基于關(guān)鍵功能,進(jìn)行初步設(shè)計(jì),基于主流程,關(guān)鍵流程,黃金流程等進(jìn)行流轉(zhuǎn)圖設(shè)計(jì),從而發(fā)現(xiàn)職責(zé)。
高層分割
切分復(fù)雜系統(tǒng),為多個(gè)二級(jí)系統(tǒng)。或者直接切分為具體子系統(tǒng)。
高層分割的兩種方式:
1、 系統(tǒng)切分
切分的考慮點(diǎn),包括系統(tǒng)功能、部署環(huán)境、語(yǔ)言、系統(tǒng)規(guī)模等
例如一個(gè)大型系統(tǒng),切分為訂單,商品,供應(yīng)鏈等系統(tǒng)。
2、 系統(tǒng)內(nèi)切分
根據(jù)系統(tǒng)的職責(zé)、調(diào)用關(guān)系、通用性等,進(jìn)行系統(tǒng)內(nèi)部切分。
最常見(jiàn)的就是分層,例如一個(gè)系統(tǒng),切分為網(wǎng)關(guān)層,服務(wù)層,搜索模塊,man 端等。
分層的角度
1、 邏輯分層
邏輯分層重視職責(zé)的劃分,職責(zé)直接常常是上層使用下層的關(guān)系,上層和下層,可以是分布在不同的機(jī)器,也可以分布在同一臺(tái)機(jī)器。
2、 物理分層
分布在不同機(jī)器上的軟件單元。
3、 通用性分層
通用性不同的,劃分為不同的層,一般通用性越大,所處的層次越靠下。
考慮非功能需求
具體方法是:采用目標(biāo) - 場(chǎng)景 - 決策表,見(jiàn)下圖:
架構(gòu)設(shè)計(jì)是質(zhì)疑驅(qū)動(dòng)的,例如,質(zhì)疑系統(tǒng)的可用性,考慮系統(tǒng)可能宕機(jī),則引入集群部署設(shè)計(jì),考慮下游接口可能超時(shí)或出現(xiàn)異常,則引入接口降級(jí)的設(shè)計(jì)等。
??考慮場(chǎng)景的 5 個(gè)要素
1、 影響來(lái)源,來(lái)自系統(tǒng)內(nèi)部還是系統(tǒng)外部
2、 如何影響的
3、 受影響的對(duì)象
4、 有什么問(wèn)題或有什么價(jià)值
5、 所處的環(huán)境為何
對(duì)場(chǎng)景的權(quán)衡因素:
價(jià)值,代價(jià),開(kāi)發(fā)難度,出現(xiàn)幾率。對(duì)于某些場(chǎng)景,經(jīng)過(guò)全面的權(quán)衡和思考,可以不支持,并不是所有的場(chǎng)景都要支持,否則可能存在過(guò)度設(shè)計(jì)。
細(xì)化架構(gòu)階段分析
邏輯視圖
邏輯視圖是對(duì)系統(tǒng)的不同部分職責(zé)的劃分,根據(jù)職責(zé)不同,可以將系統(tǒng)進(jìn)行細(xì)粒度的拆分,劃分為多個(gè)子系統(tǒng)。
分層的細(xì)化
根據(jù)系統(tǒng)設(shè)計(jì)的需要,可以將系統(tǒng)的分層進(jìn)行細(xì)化,例如展示層 -> 業(yè)務(wù)層 -> 數(shù)據(jù)層 可以細(xì)化為:展示層 -> 控制層 -> 接口層 -> 接口實(shí)現(xiàn)層 -> 數(shù)據(jù)層。
分區(qū)的引入
分區(qū)的概念是業(yè)務(wù)流程相關(guān)的,分區(qū)的依據(jù)是:職責(zé),比如結(jié)算流程可以作為一個(gè)分區(qū),下單流程可以作為一個(gè)分區(qū)。將系統(tǒng)劃分為多個(gè)分區(qū),一方面可以支持并行開(kāi)發(fā),另一方面也將系統(tǒng)劃分為多個(gè)子域,有利于業(yè)務(wù)概念和業(yè)務(wù)流程的收斂。
??機(jī)制的提取
機(jī)制是指系統(tǒng)可以抽象的公共部分,例如公共工具,公共組件,公共流程等,提取這些公共部分,對(duì)于架構(gòu)設(shè)計(jì)是至關(guān)重要的。
劃分子系統(tǒng)的原則:
1、 職責(zé)不同的單元,劃分為不同的子系統(tǒng)
2、 通用性不同的單元,劃分為不同的子系統(tǒng)
3、 需要不同開(kāi)發(fā)技能的單元,劃分為不同的子系統(tǒng)兼顧工作量,進(jìn)一步切分太大的系統(tǒng)
開(kāi)發(fā)視圖
開(kāi)發(fā)架構(gòu)視圖的任務(wù),是將 “邏輯職責(zé)” 映射為 “程序單元”,例如:要自主編寫(xiě)的 “源程序”,可重用的庫(kù),框架等;同時(shí)進(jìn)行開(kāi)發(fā)技術(shù)選型,例如:開(kāi)發(fā)語(yǔ)言,開(kāi)發(fā)工具等,然后也需要確立程序單元間的關(guān)系,project 劃分,目錄結(jié)構(gòu),編譯依賴關(guān)系等。
運(yùn)行視圖
運(yùn)行架構(gòu)設(shè)計(jì)的工作內(nèi)容,是確定引入哪些控制流:進(jìn)程,線程等;確定每條控制流的任務(wù),同時(shí)還要處理相關(guān)問(wèn)題,例如控制流的創(chuàng)建,銷毀,通信機(jī)制等,控制流之間的同步關(guān)系,是否有資源爭(zhēng)用,是否需要加鎖等也需要考慮。
物理視圖
物理架構(gòu)設(shè)計(jì)的 3 項(xiàng)任務(wù)
1. 硬件的選擇與物理拓?fù)?/p>
2. 軟件到硬件的映射關(guān)系
3. 方案的優(yōu)化
思維要點(diǎn):“開(kāi)銷” 和 “爭(zhēng)用” 是核心,應(yīng)避免爭(zhēng)用,降低開(kāi)銷。
數(shù)據(jù)視圖
數(shù)據(jù)視圖是系統(tǒng)的數(shù)據(jù)存儲(chǔ)設(shè)計(jì),根據(jù)對(duì)系統(tǒng)的分析,確定一種或多種數(shù)據(jù)策略,常見(jiàn)的數(shù)據(jù)分布策略如下 6 種:
1、獨(dú)立的 Schema
不同系統(tǒng)應(yīng)用,使用不同的數(shù)據(jù) schema,數(shù)據(jù)完全獨(dú)立,一般界限清晰的不同系統(tǒng)可以采用這種方式。
??2、集中
不同的系統(tǒng)應(yīng)用,使用同一個(gè)數(shù)據(jù)庫(kù),一般具有關(guān)聯(lián)屬性的應(yīng)用可以采用這種方式,比如一個(gè)系統(tǒng)分為服務(wù)端和管理端,但都屬于一個(gè)系統(tǒng),則可以使用同一個(gè)數(shù)據(jù)庫(kù)。
??3、分區(qū)
水平分區(qū)
水平分區(qū)即我們常見(jiàn)的分表方案,當(dāng)一個(gè) schema 無(wú)法滿足我們的數(shù)據(jù)量要求時(shí),可以劃分為多個(gè)分區(qū),每個(gè)分區(qū)存儲(chǔ)一部分?jǐn)?shù)據(jù)。
??垂直分區(qū)
垂直分區(qū)是分區(qū)策略的另外一個(gè)維度,當(dāng)我們單庫(kù)無(wú)法承載巨大的數(shù)據(jù)量時(shí),也可以根據(jù)數(shù)據(jù)的類別,進(jìn)行垂直分區(qū)。
4、復(fù)制
多個(gè)數(shù)據(jù)庫(kù)保存相同的數(shù)據(jù),根據(jù)制定的更新策略保證不同庫(kù)之間的數(shù)據(jù)同步,我們常用的讀寫(xiě)庫(kù)分離,即為此方案,主庫(kù)提供寫(xiě)能力,從庫(kù)提供讀能力,其中從庫(kù)的數(shù)據(jù)是根據(jù)主庫(kù)數(shù)據(jù)同步而來(lái)。
??5、子集
根據(jù)一些特殊的場(chǎng)景要求,需要保存原數(shù)據(jù)的部分?jǐn)?shù)據(jù),例如 Application1 保存全量訂單,application2 只需要部分出票成功的訂單,進(jìn)行后續(xù)分析操作,則可以使用子集的策略進(jìn)行數(shù)據(jù)視圖設(shè)計(jì)。
??6、重組
通過(guò)多個(gè)不同的 application 作為數(shù)據(jù)來(lái)源,異構(gòu)至其他 application,用于數(shù)據(jù)的分析或后續(xù)流程使用。
總結(jié)
架構(gòu)設(shè)計(jì)的三個(gè)階段:預(yù)備架構(gòu)階段;概念架構(gòu)階段;細(xì)化架構(gòu)階段
架構(gòu)設(shè)計(jì)的四個(gè)要素:需求結(jié)構(gòu)化;分析約束的影響;確定關(guān)鍵質(zhì)量;確定關(guān)鍵功能
概念架構(gòu)的三個(gè)步驟:基于關(guān)鍵功能初步設(shè)計(jì);系統(tǒng)高層分割;分析非功能需求
細(xì)化架構(gòu)的五個(gè)視圖:邏輯視圖;開(kāi)發(fā)視圖;運(yùn)行視圖;物理視圖;數(shù)據(jù)視圖
一個(gè)貫穿環(huán)節(jié):非功能需求的考慮
參考資料
1.《一線架構(gòu)設(shè)計(jì)指南》
作者:京東零售 馮曉濤
來(lái)源:京東云開(kāi)發(fā)者社區(qū) 轉(zhuǎn)載請(qǐng)注明來(lái)源