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