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