在架构的过程当中,一个系统的质量属性主要考虑的是六个方面:可用性、可修改性、性能、安全性、可测试性以及易用性。实现这些质量属性依赖于基本的设计决策——战术,而战术就是影响质量属性响应控制的设计决策。其中包含六中战术分别对应系统质量属性考虑的六个方面,这六种战术的结合被称为“架构设计策略”,我我的认为更像是架构设计时的智慧。程序员
接下来我分别针对六种质量属性的战术来谈一谈个人见解和看法,也会提供一些相应的实例来供你们思考。设计模式
目标:可用性战术将会阻止错误发展成故障,或者至少可以把错误的影响限制在必定范围内,从而使系统恢复成为可能。安全
维持可用性的战术主要有三种:错误检测、自动恢复以及错误预防。错误检测是用来检测故障的某种类型的健康监视,能够经过信号/响应、心跳、抛出异常等方式来实现。自动恢复能够检测到故障时某种类型的恢复,能够经过监测和修复或者是从新引入等方式来实现。错误预防则是为了防止错误演变成故障,能够经过从服务中删除事务或设立进程监视器等方式来实现。服务器
一切的目的都是为了持续的维持系统的可以使用状态,不由于用户的误操做或者是系统自己的问题而致使错误的扩大,尽可能保证系统的鲁棒性。网络
实例:最多见的提升系统可用性的方式就是在编码过程当中多写try/catch,若是一个不够那就多写几个,一个好的程序员每每也都会有本身的库,其中就包含一个异常库,系统若是没有按照既定的方向运行就会throw出一个Exception,这些都会写入系统的运行日志当中,根据抛出不一样的异常系统会作出相应的错误处理反应,避免出现由于错误而影响全局的状况。架构
除非你看到问题的发生,不然你不会知道如今的系统当中存在着什么问题。经过提升系统的可用性能够保持系统能够在可接受范围内处理错误,避免错误发展成为故障从而产生更大的影响。并发
目标:控制实现、测试和部署变动的时间和成本。函数
维持可修改性的战术主要有三种:局部化修改、防止连锁反应以及延迟绑定时间。局部化修改的目标是减小由某个变动直接影响的模块的数量,能够经过维持语义一致性、泛化模块、限制选择等方式来实现。防止连锁反应的目标是限制对局部化的模块的修改,以防止对某个模块的修改间接地影响到其余模块,能够经过隐藏信息、维持现有的接口、使用仲裁者等方式来实现。延迟绑定时间的目标是控制部署时间并容许非开发人员进行修改,能够经过运行时注册、配置文件、多态等方式来实现。高并发
提升系统的可修改性的目的是为了加强系统的弹性,使系统向高内聚低耦合靠拢,让其具有更高的便携性,能够根据后期的反馈进行更新而不须要进行总体的大变更。从开发角度下降了修改的时间成本和金钱成本。性能
实例:软件设计模式当中的抽象工厂模式为例,每个组件只负责单一简单的工做,经过组合来完成一个大的项目,使用抽象模块来创建各个工厂类之间的联系,在对一个具体的类进行修改或增长内容时也无需对其余部分进行改动。
一个好的系统不会是一成不变的,而是在面对用户的反馈进行一步一步的更新,提升系统的可修改性就能够减小在更新迭代中所付出的无用的返工成本。
目标:对必定的时间限制内到达系统的时间生成一个响应,这些时间能够是消息到达、定时器到时以及系统状态的变化。
维持性能的战术主要有三类:资源需求、资源管理以及资源仲裁。资源需求是分析影响性能的资源因素,能够经过提升计算效率、减小计算开销、管理时间率等方式来实现。资源管理是提升资源的应用效率,能够经过引入并发、维持多个副本、增长可用资源等方式来实现。资源仲裁是解决资源的争用,能够经过调整调度策略来实现。
提升系统的性能是为了加快系统的响应速度,缩短系统反应的时间。谁都不想使用一个反应迟钝的系统,若是用户在数秒以内没有得到系统应该给出的反应,那必然会影响使用体验,倘若这个时间再长一些,用户怕是会立马关掉而且不会想再打开第二次了,那么这对于一个系统的架构来讲就是失败的。
实例:老生常谈的12306春运高并发购票的问题,春运期间庞大的并发量直接将网站击垮,对此12306互联网购票系统的改造给了咱们一个很好的答案。其创建了一个可伸缩扩展的云应用平台,在网络阻塞时能够动态增长带宽,当服务器CPU到达高位时,能够快速从资源池获取虚拟机资源来分摊负荷。这就是一个成功的案例,网站初次创建是因为硬件的技术和用户的需求,谁也没有想到会如此快速的增加到这么高的并发,可是随着时代的发展,系统的性能就显得尤其重要。
提升系统的性能无疑能够优化用户的使用体验,可是拥有一我的能够接受的正常性能则是一个系统的必然要求,不一样的系统对性能的要求都不能脱离开其业务流程来谈,在提升系统性能上付出的成本也应该与其主要的业务流程和用户的体量大小相对应。
目标:系统检测、抵抗或从攻击中恢复。
维持系统安全性的战术主要有三种:抵抗攻击、检测攻击以及从攻击中恢复。抵抗攻击能够经过身份验证、用户受权、数据加密、检验数据完整性等方式来实现。检测攻击能够经过入侵检测等方式来实现。从攻击中恢复能够经过设置冗余来恢复并设置审计追踪等方式来实现。
提升系统的安全性是为了增长系统抵抗恶意操做、恶意入侵等非法操做的能力。其重要性与系统内部的信息重要程度是成正比的,越重要的信息被坏人觊觎的可能性越大,就须要更够的堡垒来保护。
实例:提到安全性就不得不说一说区块链,区块链一贯以数据透明,可溯源著称,想要篡改其中的信息就须要付出远远超出其价值的成本,经过公开广播到每个节点的方式来实现信息的不可篡改。另外再举一个例子,现在各个社交软件的动态安全性都较高,经过对用户身份的绑定来多角度验证使用者是不是本人,密码、手机令牌、邮箱各类验证都是在提升系统的安全性。
网络环境是复杂的,你没法判断正在使用你的系统的人是一个正经常使用户仍是一个想要窃取机密的坏蛋,拥有一个安全的防御措施是很是必要的。
目标:容许在完成软件开发的一个增量后,轻松地对软件进行测试。
维持系统可测试性的战术主要有两种:管理输入/输出以及内部监视。管理输入/输出能够经过记录/回放、将接口与实现分离、特化访问路线/接口等方式来实现。内部监视能够经过内置监视器等方式来实现。
检测的目的就是为了检测出错误,更早的发现错误能够减小更改错误的成本。提升系统的可测试性能够简化系统的测试流程,使得错误更容易被发现。
实例:在开发过程当中常常须要测试本身代码的正确性,判断一个方法的输出是否符合要求,可是又不能每一次都为方法的测试写一个主函数来运行,因此在一个方法中应当完成一个简单单一的功能,一个模块是一个个体,能够被单独的进行测试,单个模块测试完毕以后再进行组合进行集成测试,这是一个从小变大的过程。
系统的错误发现的越晚想要更改其花费的成本就越大,尽早的发现系统中的bug能够下降维护成本,而提升系统的可测试性则是让系统能够更加全面更加容易的被测试,让错误更容易被发现。
目标:与用户完成指望任务的难以程度以及系统为用户提供的支持种类有关。
维持系统易用性的战术主要有三种:分离用户接口、支持用户主动、维持用户一个模型。支持用户主动能够经过取消、撤销、聚合等方式来实现。维持用户一个模型能够经过创建用户模型、系统模型、任务模型来实现。
主要是为用户提供适当的反馈和协助,经过为用户提供关于系统正在作什么的反馈,以及为用户提供发出基于易用性命令的能力来加强易用性。
实例:易用性在任何一个合格的系统中都有体现,如输入法会根据你平常的键入来学习的输入习惯,从而让你更常常打的字出如今前面,再好比编译器中根据已有输入进行的代码补全,大大提升了编码的效率和正确性。
易用性提升的不只仅是用户的使用体验,更是一种人性的理解,更容易上手的软件每每更容易获得用户的青睐。