淺談質量屬性
在架構的過程中,一個系統的質量屬性主要考慮的是六個方面:可用性、可修改性、效能、安全性、可測試性以及易用性。實現這些質量屬性依賴於基本的設計決策——戰術,而戰術就是影響質量屬性響應控制的設計決策。其中包含六中戰術分別對應系統質量屬性考慮的六個方面,這六種戰術的結合被稱為“架構設計策略”,我個人認為更像是架構設計時的智慧。
接下來我分別針對六種質量屬性的戰術來談一談我的看法和見解,也會提供一些相應的例項來供大家思考。
可用性戰術
目標:可用性戰術將會阻止錯誤發展成故障,或者至少能夠把錯誤的影響限制在一定範圍內,從而使系統恢復成為可能。
維持可用性的戰術主要有三種:錯誤檢測、自動恢復以及錯誤預防。錯誤檢測是用來檢測故障的某種型別的健康監視,可以通過訊號/響應、心跳、丟擲異常等方式來實現。自動恢復可以檢測到故障時某種型別的恢復,可以通過監測和修復或者是重新引入等方式來實現。錯誤預防則是為了防止錯誤演變成故障,可以通過從服務中刪除事務或設立程式監視器等方式來實現。
一切的目的都是為了持續的維持系統的可使用狀態,不因為使用者的誤操作或者是系統本身的問題而導致錯誤的擴大,儘量保證系統的魯棒性。
例項:最常見的提高系統可用性的方式就是在編碼過程中多寫try/catch,如果一個不夠那就多寫幾個,一個好的程式設計師往往也都會有自己的庫,其中就包含一個異常庫,系統如果沒有按照既定的方向執行就會throw出一個Exception,這些都會寫入系統的執行日誌當中,根據丟擲不同的異常系統會做出相應的錯誤處理反應,避免出現因為錯誤而影響全域性的情況。
除非你看到問題的發生,否則你不會知道現在的系統當中存在著什麼問題。通過提高系統的可用性可以保持系統可以在可接受範圍內處理錯誤,避免錯誤發展成為故障從而產生更大的影響。
可修改性戰術
目標:控制實現、測試和部署變更的時間和成本。
維持可修改性的戰術主要有三種:區域性化修改、防止連鎖反應以及延遲繫結時間。區域性化修改的目標是減少由某個變更直接影響的模組的數量,可以通過維持語義一致性、泛化模組、限制選擇等方式來實現。防止連鎖反應的目標是限制對區域性化的模組的修改,以防止對某個模組的修改間接地影響到其他模組,可以通過隱藏資訊、維持現有的介面、使用仲裁者等方式來實現。延遲繫結時間的目標是控制部署時間並允許非開發人員進行修改,可以通過執行時註冊、配置檔案、多型等方式來實現。
提高系統的可修改性的目的是為了增強系統的彈性,使系統向高內聚低耦合靠攏,讓其具備更高的便攜性,可以根據後期的反饋進行更新而不需要進行整體的大變動。從開發角度降低了修改的時間成本和金錢成本。
例項:軟體設計模式當中的抽象工廠模式為例,每一個元件只負責單一簡單的工作,通過組合來完成一個大的專案,使用抽象模組來建立各個工廠類之間的聯絡,在對一個具體的類進行修改或增加內容時也無需對其他部分進行改動。
一個好的系統不會是一成不變的,而是在面對使用者的反饋進行一步一步的更新,提高系統的可修改性就可以減少在更新迭代中所付出的無用的返工成本。
效能戰術
目標:對一定的時間限制內到達系統的時間生成一個響應,這些時間可以是訊息到達、定時器到時以及系統狀態的變化。
維持效能的戰術主要有三類:資源需求、資源管理以及資源仲裁。資源需求是分析影響效能的資源因素,可以通過提高計算效率、減少計算開銷、管理時間率等方式來實現。資源管理是提高資源的應用效率,可以通過引入併發、維持多個副本、增加可用資源等方式來實現。資源仲裁是解決資源的爭用,可以通過調整排程策略來實現。
提高系統的效能是為了加快系統的響應速度,縮短系統反應的時間。誰都不想使用一個反應遲鈍的系統,如果使用者在數秒之內沒有獲得系統應該給出的反應,那必然會影響使用體驗,假若這個時間再長一些,使用者怕是會立馬關掉並且不會想再開啟第二次了,那麼這對於一個系統的架構來說就是失敗的。
例項:老生常談的12306春運高併發購票的問題,春運期間龐大的併發量直接將網站擊垮,對此12306網際網路購票系統的改造給了我們一個很好的答案。其建立了一個可伸縮擴充套件的雲應用平臺,在網路阻塞時可以動態增加頻寬,當伺服器CPU到達高位時,可以快速從資源池獲取虛擬機器資源來分攤負荷。這就是一個成功的案例,網站初次建立是由於硬體的技術和使用者的需求,誰也沒有想到會如此快速的增長到這麼高的併發,但是隨著時代的發展,系統的效能就顯得尤為重要。
提高系統的效能無疑可以優化使用者的使用體驗,但是擁有一個人可以接受的正常效能則是一個系統的必然要求,不同的系統對效能的要求都不能脫離開其業務流程來談,在提高系統效能上付出的成本也應該與其主要的業務流程和使用者的體量大小相對應。
安全性戰術
目標:系統檢測、抵抗或從攻擊中恢復。
維持系統安全性的戰術主要有三種:抵抗攻擊、檢測攻擊以及從攻擊中恢復。抵抗攻擊可以通過身份驗證、使用者授權、資料加密、檢驗資料完整性等方式來實現。檢測攻擊可以通過入侵檢測等方式來實現。從攻擊中恢復可以通過設定冗餘來恢復並設定審計追蹤等方式來實現。
提高系統的安全性是為了增加系統抵抗惡意操作、惡意入侵等非法操作的能力。其重要性與系統內部的資訊重要程度是成正比的,越重要的資訊被壞人覬覦的可能性越大,就需要更夠的堡壘來保護。
例項:提到安全性就不得不說一說區塊鏈,區塊鏈一向以資料透明,可溯源著稱,想要篡改其中的資訊就需要付出遠遠超出其價值的成本,通過公開廣播到每一個節點的方式來實現資訊的不可篡改。另外再舉一個例子,如今各個社交軟體的動態安全性都較高,通過對使用者身份的繫結來多角度驗證使用者是否是本人,密碼、手機令牌、郵箱各種驗證都是在提高系統的安全性。
網路環境是複雜的,你無法判斷正在使用你的系統的人是一個正常使用者還是一個想要竊取機密的壞蛋,擁有一個安全的防護措施是非常必要的。
可測試性戰術
目標:允許在完成軟體開發的一個增量後,輕鬆地對軟體進行測試。
維持系統可測試性的戰術主要有兩種:管理輸入/輸出以及內部監視。管理輸入/輸出可以通過記錄/回放、將介面與實現分離、特化訪問路線/介面等方式來實現。內部監視可以通過內建監視器等方式來實現。
檢測的目的就是為了檢測出錯誤,更早的發現錯誤可以減少更改錯誤的成本。提高系統的可測試性可以簡化系統的測試流程,使得錯誤更容易被發現。
例項:在開發過程中經常需要測試自己程式碼的正確性,判斷一個方法的輸出是否符合要求,但是又不能每一次都為方法的測試寫一個主函式來執行,所以在一個方法中應當完成一個簡單單一的功能,一個模組是一個個體,可以被單獨的進行測試,單個模組測試完畢之後再進行組合進行整合測試,這是一個從小變大的過程。
系統的錯誤發現的越晚想要更改其花費的成本就越大,儘早的發現系統中的bug可以降低維護成本,而提高系統的可測試性則是讓系統可以更加全面更加容易的被測試,讓錯誤更容易被發現。
易用性戰術
目標:與使用者完成期望任務的難以程度以及系統為使用者提供的支援種類有關。
維持系統易用性的戰術主要有三種:分離使用者介面、支援使用者主動、維持使用者一個模型。支援使用者主動可以通過取消、撤銷、聚合等方式來實現。維持使用者一個模型可以通過建立使用者模型、系統模型、任務模型來實現。
主要是為使用者提供適當的反饋和協助,通過為使用者提供關於系統正在做什麼的反饋,以及為使用者提供發出基於易用性命令的能力來增強易用性。
例項:易用性在任何一個合格的系統中都有體現,如輸入法會根據你日常的鍵入來學習的輸入習慣,從而讓你更經常打的字出現在前面,再比如編譯器中根據已有輸入進行的程式碼補全,大大提高了編碼的效率和正確性。
易用性提高的不僅僅是使用者的使用體驗,更是一種人性的理解,更容易上手的軟體往往更容易得到使用者的青睞。