別做平庸Coder!掌握這十個架構絕技,讓你成為團隊MVP
一般來說,軟件系統的需求可以分為兩類:功能需求和非功能需求。軟件系統的架構設計需要滿足這兩類需求。特別是系統架構對軟件非功能需求的支持,成為架構的質量屬性。本文描述了軟件的10個質量屬性,但這并不意味著每個質量屬性都會出現在架構設計中;你可以選擇對你的產品最重要的質量屬性,然后實現它們。
可擴展性
隨著用戶數量或請求數量的增加,系統的運行和操作能力也會增加。在云平臺上,可通過水平或垂直擴展機器或簡單地附加一個自動擴展組來實現可擴展性。
- 流量模式:了解系統的流量模式。即使機器利用率低,也不值得生成盡可能多的機器。
- 日常模式:特定區域的流量在早上增加,晚上減少。
- 全球/區域模式:某些區域的應用程序使用量很大。
- 突發流量:許多用戶在高峰期或人口稠密地區請求資源,但只有少數機器能夠提供服務。
- 自動擴展:能夠快速啟動一些機器來處理突發流量,并在需求減少時優雅地縮減。
- 延遲:能夠盡快為請求提供服務,包括優化算法和在用戶位置附近復制系統以減少往返請求。
可用性
通過正常運行時間的百分比來衡量,定義系統正常運行和工作時的時間比例。可用性受系統錯誤、基礎設施問題、惡意攻擊和系統負載的影響。
- 部署標簽:部署應用組件的多個獨立副本,包括數據存儲區。
- 區域部署:將后端服務部署到一組地理節點,每個節點可以處理來自任何區域的任何客戶端請求。
可擴展性
可擴展性指標擴展系統的能力以及實現可擴展性所需的工作。擴展可以通過添加新功能或修改現有功能來實現,原則是在不影響當前系統功能的前提下進行增強。
模塊化/可重用性:可重用性和可擴展性使技術能夠轉移到另一個項目中,減少開發和維護時間,同時增強可靠性和一致性。可插拔性:能夠輕松插入其他組件,如微內核架構。
一致性
一致性確保每次讀取操作返回最新的寫操作結果。這意味著在執行每次操作后,所有節點上的數據都是一致的,因此無論連接到哪個節點,所有客戶端都能同時看到相同的數據。一致性提高了數據的新鮮度。
彈性
可恢復性:準備和功能的過程可以在意外變化發生后將服務恢復到初始操作狀態。意外變化包括應用程序的軟刪除或硬刪除或配置錯誤。災難恢復包括旨在防止或盡量減少災難性事件造成的數據丟失和業務中斷的最佳實踐,涵蓋從設備故障和局部停電到網絡攻擊、民事緊急情況、犯罪或軍事攻擊,以及自然災害。
設計模式:
- 隔離:將應用程序的元素隔離到池中,以便當一個池失敗時,其他元素繼續運行。
- 斷路器:在連接到遠程服務或資源時,處理可能需要不同時間修復的故障。
- 選舉:通過選舉一個實例作為負責管理其他實例的領導者,協調分布式應用程序中協作任務實例集合執行的操作。
可觀察性
可觀察性是收集有關程序執行、內部模塊狀態和組件之間通信的數據的能力。可以使用各種測試和跟蹤技術和工具來提高可觀察性。
- 日志記錄:在每個請求中生成不同類型的日志:事件日志、事務日志、消息日志和服務器日志。
- 警報和監控:準備監控儀表板,創建SLIs(服務級別指標)并設置關鍵警報。
- L1/L2/L3:為L1/L2設置隨叫隨到的支持流程。L1支持與客戶互動,L2支持將L1路由到他們的票據并協助排除故障。L3是最終支持級別,通常涉及解決技術問題的開發團隊。
安全性
軟件保護信息和數據,為個人或其他產品或系統提供相應級別的數據訪問類型和授權。這一系列功能包括機密性(數據只能由授權人員訪問)、完整性(軟件防止未經授權的訪問或修改軟件或信息)、不可否認性(能夠證明已發生的行為或事件)、可追責性(能夠追蹤用戶行為)和真實性(驗證用戶身份)。
- 審計性:審核和跟蹤系統活動,以便在安全漏洞發生時識別安全漏洞,確定漏洞的機制和范圍。遠程存儲審計跟蹤可以防止入侵者掩蓋其蹤跡。
合法性:
- 合規性:遵守GDPR和個人信息保護法等數據保護法律法規。
- 隱私:能夠對公司內部員工隱藏交易(加密交易,即使是DBA和網絡架構師也看不到)。
- 身份驗證:確保用戶身份的安全要求。
- 授權:確保用戶只能訪問應用程序中的某些功能(通過用例、子系統、網頁、業務規則和字段級權限)。
持久性
耐久性是軟件在長時間內提供服務并滿足用戶需求的能力。
- 復制:涉及共享信息以確保冗余資源之間的一致性,從而提高可靠性、容錯性或可訪問性。
- 容錯:容錯性是一種允許系統在一個或多個組件發生故障時繼續正常運行的功能。
- 歸檔:數據是否需要在一段時間后歸檔或刪除?(例如,客戶數據將在三個月后刪除或標記為過時,并在備用數據庫中歸檔以供將來訪問。)
敏捷性
敏捷性已成為描述當代軟件方法學的流行術語,敏捷團隊可能是那些能夠適應變化的團隊。
- 可維護性:修改應用程序和增強系統的難易程度。它表示開發人員在修改軟件以改進、糾正或適應環境和需求變化方面的有效性和效率。
- 可測試性:開發人員和其他人測試軟件的難易程度。
- 開發容易性:開發人員在修改軟件時不會引入缺陷或損害現有產品質量的程度。
- 可部署性:從代碼提交到生產部署所需的時間。
- 可安裝性:在所有必要的平臺上安裝系統的難易程度。
- 可升級性:能夠輕松/快速地在服務器和客戶端上升級此應用程序/解決方案的以前版本。
- 可移植性:系統是否需要在多個平臺上運行?(例如,前端是否需要與Oracle和SAP對接?)
- 可配置性:最終用戶可以通過可用接口輕松更改軟件配置的各個方面。
- 兼容性:產品、系統或組件在共享相同硬件或軟件環境時與其他產品、設計或成員交換信息的程度。
結語
在了解軟件架構的10個質量屬性后,我們可能需要考慮哪些質量屬性更適合我們的產品或項目。那么,我們如何在項目中繼續采用這些特性?
一旦了解了功能需求,嘗試識別系統中可能阻礙這些功能的瓶頸。如何找到瓶頸?你可以嘗試回答幾個問題,例如:
- 系統能否在超過1億用戶的規模上運行?
- 系統能否處理1萬個并發請求?
- 數據處理是否安全?
- 是否可以輕松添加更多功能而不影響現有功能?通過回答這些問題,我們可以更好地理解和應用軟件架構的質量屬性,提高系統的整體性能和可靠性。