軟件架構(gòu)的十個(gè)質(zhì)量屬性
一般地,對(duì)于軟件系統(tǒng)的需求而言,分為兩類:功能性需求和非功能性需求。軟件系統(tǒng)的架構(gòu)設(shè)計(jì)既要滿足軟件的功能性需求,還要滿足軟件的非功能性需求。特別地, 系統(tǒng)架構(gòu)對(duì)軟件非功能性需求的支撐成為架構(gòu)的質(zhì)量屬性。本文描述了軟件的10個(gè)質(zhì)量屬性, 但不意味著每個(gè)質(zhì)量屬性都會(huì)在架構(gòu)設(shè)計(jì)中呈現(xiàn),可以挑選對(duì)產(chǎn)品最重要的質(zhì)量屬性,然后進(jìn)行實(shí)現(xiàn)。
1 可伸縮性
隨著用戶或請(qǐng)求數(shù)量的增加,系統(tǒng)運(yùn)行和操作的能力也隨之增加。在云平臺(tái)上,可伸縮性可以通過(guò)機(jī)器的水平或垂直縮放或者簡(jiǎn)單地附加 AutoScalingGroup 來(lái)實(shí)現(xiàn)。
流量模式: 了解系統(tǒng)的交通模式。盡可能多地產(chǎn)生機(jī)器是不劃算的,即使它的利用率不高。
- 日行模式: 特定地區(qū)的交通在早上增加,晚上減少。
- 全局/區(qū)域模式: 區(qū)域大量使用應(yīng)用程序。
- 突發(fā)流量: 許多用戶都在請(qǐng)求資源,但是只有少數(shù)幾臺(tái)機(jī)器可以為突發(fā)的流量提供服務(wù)。這些可能發(fā)生在高峰期或人口密集地區(qū)。
自動(dòng)縮放: 能夠迅速產(chǎn)生一些機(jī)器,以處理流量的爆發(fā),當(dāng)需求正在減少時(shí),優(yōu)雅地收縮。
延遲: 能夠盡快為請(qǐng)求提供服務(wù)。這還包括優(yōu)化算法和在用戶位置附近復(fù)制系統(tǒng),以減少請(qǐng)求的往返。
2 可用性
它以正常運(yùn)行時(shí)間的百分比來(lái)衡量,并定義了系統(tǒng)正常運(yùn)行和正常工作的時(shí)間比例。可用性受到系統(tǒng)錯(cuò)誤、基礎(chǔ)設(shè)施問(wèn)題、惡意攻擊和系統(tǒng)負(fù)載的影響。
部署標(biāo)記: 部署應(yīng)用程序組件的多個(gè)獨(dú)立副本,包括數(shù)據(jù)存儲(chǔ)區(qū)
區(qū)域部署: 將后端服務(wù)部署到一組地理節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)都可以服務(wù)任何區(qū)域中的任何客戶端請(qǐng)求。
3 可擴(kuò)展性
可擴(kuò)展性度量擴(kuò)展了系統(tǒng)的能力和實(shí)現(xiàn)擴(kuò)展所需的工作。擴(kuò)展可以通過(guò)添加新功能或修改現(xiàn)有功能來(lái)實(shí)現(xiàn),該原則規(guī)定在不損害當(dāng)前系統(tǒng)功能的情況下進(jìn)行增強(qiáng)。
模塊化/可重用性: 可重用性和可擴(kuò)展性使得技術(shù)可以以更少的開(kāi)發(fā)和維護(hù)時(shí)間轉(zhuǎn)移到另一個(gè)項(xiàng)目,同時(shí)增強(qiáng)了可靠性和一致性。
可插拔性: 能夠輕松地插入其他組件,比如微內(nèi)核架構(gòu)。
4 一致性
一致性保證每個(gè)讀操作返回最近的寫操作。這意味著在執(zhí)行每個(gè)操作之后,所有節(jié)點(diǎn)的數(shù)據(jù)都是一致的,因此,,無(wú)論它們連接到哪個(gè)節(jié)點(diǎn),所有客戶端都可以同時(shí)看到相同的數(shù)據(jù)。一致性提高了數(shù)據(jù)的新鮮程度。
5 彈性
系統(tǒng)可以從容地處理意外故障和惡意故障并進(jìn)行恢復(fù),檢測(cè)故障并快速有效地恢復(fù)對(duì)于保持彈性是必要的。
可恢復(fù)性: 準(zhǔn)備的過(guò)程和功能能夠在發(fā)生意外更改后將服務(wù)返回到初始運(yùn)行狀態(tài)。意外的更改包括應(yīng)用程序的軟刪除或硬刪除或錯(cuò)誤配置。災(zāi)難恢復(fù)包括了旨在防止或盡量減少災(zāi)難性事件造成的數(shù)據(jù)丟失和業(yè)務(wù)中斷的最佳實(shí)踐,涵蓋了從設(shè)備故障和局部停電到網(wǎng)絡(luò)攻擊、民事緊急情況、犯罪或軍事攻擊以及自然災(zāi)害。
設(shè)計(jì)模式:
- 隔離: 將應(yīng)用程序的元素隔離到池中,以便在一個(gè)池失敗時(shí),其他元素繼續(xù)運(yùn)行。
- 斷路器: 當(dāng)連接到遠(yuǎn)程服務(wù)或資源時(shí),處理可能需要花費(fèi)不同時(shí)間來(lái)修復(fù)的故障。
- 選舉: 通過(guò)選舉一個(gè)實(shí)例作為負(fù)責(zé)管理其他實(shí)例的領(lǐng)導(dǎo)者,協(xié)調(diào)分布式應(yīng)用程序中協(xié)作任務(wù)實(shí)例集合執(zhí)行的操作。
6 易用性
可用性可以描述為一個(gè)系統(tǒng)的能力,為其用戶提供一個(gè)條件,以執(zhí)行任務(wù)的安全有效,同時(shí)擁有良好的用戶體驗(yàn)。它是指特定的消費(fèi)者能夠使用軟件在量化的環(huán)境中以有效、高效和滿意的方式實(shí)現(xiàn)量化目標(biāo)的程度。
易訪問(wèn)性: 讓具有最廣泛特征和功能的人可以使用該軟件。這包括失聰、失明、色盲等用戶。
易學(xué)性: 用戶學(xué)習(xí)如何使用軟件有多容易?
API 契約: 對(duì)于內(nèi)部團(tuán)隊(duì),理解 API 契約有助于輕松接入任何系統(tǒng)。
7 可觀測(cè)性
可觀測(cè)性是收集關(guān)于程序執(zhí)行、模塊內(nèi)部狀態(tài)及組件間通信的數(shù)據(jù)的能力。為了提高可觀測(cè)性,可以使用各種測(cè)試跟蹤技術(shù)和工具。
日志記錄: 在每個(gè)請(qǐng)求中生成不同類型的日志: 事件日志、事務(wù)日志、消息日志和服務(wù)器日志。
警報(bào)和監(jiān)控: 準(zhǔn)備監(jiān)控儀表板,創(chuàng)建 SLI (服務(wù)水平指示器)并設(shè)置關(guān)鍵警報(bào)。
L1/L2/L3: 為 L1/L2設(shè)置隨叫隨到的支持流程。L1支持包括與客戶交互,L2支持 L1路由到它們的工單,并幫助進(jìn)行故障排除。L3是支持的最后一環(huán),通常包括一個(gè)解決技術(shù)問(wèn)題的開(kāi)發(fā)團(tuán)隊(duì)。
8 安全性
軟件保護(hù)信息和數(shù)據(jù),使人或其他產(chǎn)品或系統(tǒng)有相應(yīng)的數(shù)據(jù)訪問(wèn)類型和授權(quán)水平。這一系列特征包括機(jī)密性(數(shù)據(jù)只能被授權(quán)訪問(wèn)) ,完整性(軟件防止未經(jīng)授權(quán)訪問(wèn)或修改軟件或信息) ,不可否認(rèn)性(能否證明已經(jīng)發(fā)生的行為或事件) ,問(wèn)責(zé)性(能否追蹤用戶的行為)和真實(shí)性(驗(yàn)證用戶的身份)。
可審核性: 審核并跟蹤系統(tǒng)活動(dòng),以便在發(fā)生安全性缺陷時(shí),可以確定缺陷的機(jī)制和程度。遠(yuǎn)程存儲(chǔ)審計(jì)跟蹤(可以防止入侵者掩蓋其蹤跡。
合法性:
- 遵守: 遵守 GDPR、 《個(gè)保法》等關(guān)于數(shù)據(jù)保護(hù)的法律法規(guī)。
- 隱私: 對(duì)公司內(nèi)部員工隱藏事務(wù)的能力(加密的事務(wù),甚至 DBA 和網(wǎng)絡(luò)架構(gòu)師也看不到它們)。
身份驗(yàn)證: 確保用戶身份的安全性要求。
授權(quán): 確保用戶只能訪問(wèn)應(yīng)用程序中的某些功能(通過(guò)用例、子系統(tǒng)、網(wǎng)頁(yè)、業(yè)務(wù)規(guī)則、字段級(jí)別等)。
9 持久性
持久性是軟件可服務(wù)性的解決能力,能夠較長(zhǎng)時(shí)間地滿足用戶的需求。
復(fù)制: 涉及共享信息,以確保冗余資源之間的一致性,從而提高可靠性、容錯(cuò)性或可訪問(wèn)性。
容錯(cuò)性: 容錯(cuò)性是一種特性,它使系統(tǒng)能夠在某些組件出現(xiàn)一個(gè)或多個(gè)故障時(shí)繼續(xù)正常運(yùn)行。
可歸檔性: 數(shù)據(jù)是否需要在一段時(shí)間后歸檔或刪除?(例如,客戶數(shù)據(jù)將在三個(gè)月后被刪除,或被標(biāo)記為過(guò)時(shí),并存檔在備用數(shù)據(jù)庫(kù)中,以便將來(lái)訪問(wèn)。)
10 敏捷性
敏捷已經(jīng)成為當(dāng)今描述當(dāng)代軟件方法的流行語(yǔ),相關(guān)的敏捷團(tuán)隊(duì)可能是一個(gè)能夠適應(yīng)變化的團(tuán)隊(duì)。
可維護(hù)性: 應(yīng)用更改和增強(qiáng)系統(tǒng)有多容易?表示開(kāi)發(fā)人員可以修改軟件以改進(jìn)、糾正或使其適應(yīng)環(huán)境和需求變化的有效性和效率程度。
- 可測(cè)試性: 開(kāi)發(fā)人員和其他人員測(cè)試軟件的容易程度
- 易于開(kāi)發(fā): 開(kāi)發(fā)人員在不引入缺陷或降低現(xiàn)有產(chǎn)品質(zhì)量的情況下修改軟件的程度
可部署性: 在提交部署之后到代碼投入生產(chǎn)的時(shí)間。
可安裝性: 易于在所有必要的平臺(tái)上安裝系統(tǒng)。
可升級(jí)性: 在服務(wù)器和客戶端上從此應(yīng)用程序/解決方案的以前版本輕松/快速升級(jí)到較新版本的能力。
可移植性: 系統(tǒng)是否需要在多個(gè)平臺(tái)上運(yùn)行?(例如,前端是否需要針對(duì) Oracle 和 SAP 運(yùn)行?)
可配置性: 最終用戶可以輕松地更改軟件配置的各個(gè)方面(通過(guò)可用的接口)。
兼容性: 產(chǎn)品、系統(tǒng)或組件在共享相同的硬件或軟件環(huán)境時(shí),與其他產(chǎn)品、設(shè)計(jì)或成員交換信息并執(zhí)行所需功能的程度。
小結(jié)
了解了軟件架構(gòu)中的10個(gè)質(zhì)量屬性,我們可能需要考慮哪一個(gè)質(zhì)量屬性更是適合自己的產(chǎn)品或項(xiàng)目。那么,如何在項(xiàng)目中繼續(xù)采用這些特性呢?
一旦了解了功能性需求,嘗試找出系統(tǒng)中可能給這些功能增加障礙的瓶頸。如何找到瓶頸呢?可以試著回答幾個(gè)這樣的問(wèn)題:
- 系統(tǒng)能否在100M以上用戶規(guī)模的基礎(chǔ)上運(yùn)行?
- 系統(tǒng)能處理10,000個(gè)并發(fā)請(qǐng)求嗎?
- 是否以安全的方式處理數(shù)據(jù)?
- 是否可以在不影響現(xiàn)有工作特性的情況下輕松地添加更多特性?
- ......