论软件体系结构之质量属性
张千龙
(石家庄铁道大学,河北省石家庄市,050043)
摘要:软件架构重点关注的是质量属性。文章从常见的六个质量属性,即可用性、可修改性、性能、安全性、可测试性、易用性写起,使读者对其有初步的认识和了解。解决了在具体的软件开发环境中的质量属性是什么,怎么用,如何用好的问题。在软件开发过程中软件的质量属性扮演者至关重要的角色,只有合理地遵循质量属性原则,才能开发出更好的产品。
关键词:质量属性;体系结构;软件
On Quality Attributes of Software Architecture
Zhang Qianlong
(Shijiazhuang Tiedao University, Shijiazhuang 050043, China)
Abstract: Software architecture focuses on quality attributes.This article starts with six common quality attributes, namely usability, modifiability, performance, security, testability, and ease of use, so that readers can have a preliminary understanding of them.Solve the quality attribute in the specific software development environment is what, how to use, how to use the good problem.The quality attribute of software plays an important role in the process of software development. Only by following the principle of quality attribute reasonably can better products be developed.
Key words: quality attribute;Architecture;software
引言
伴随着软件复杂性的日益增长,软件开发的周期以及费用也在日益增长,人们对于软件质量的保证与提高越来越重视。而为了了解软件的质量是否满足要求,我们必须定义软件的质量属性。同时质量属性也是影响软件架构的重要因素。软件架构主要由需求决定,需求有功能性的和非功能性的,其中非功能性的需求主要就是指质量属性。下面我们讨论一下其中最常见的六个属性。
一、可用性
1.定义:
可用性是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系统崩溃情况下能够恢复正常运行的速度来衡量的。
一般将系统可用性定义为:
a = 平均正常工作时间 / (平均正常工作时间+平均修复时间)
2.可用性关注的问题:
如何检测故障
发生故障的频度
出现故障时的现象
系统故障排除的时限
如何防止故障的发生
发生故障时的处理
3.错误检测:
(1)命令/响应:这个在ajax中有所应用,ajax有专门的success方法和error方法来对发出的请求做出响应。
(2)心跳(计时器):一个组件定期发出一个心跳消息,另一个组件接收听该信息。如果心跳失败,则假定最初的组件失败,并通知错误纠正组件。。
(3)异常:这个最常见的就是try{}catch{}finally{}以及if语句进行判断。
4.错误恢复:
(1)表决:当表决者接收到多个处理器发过来的数值不同时,需要对结果产生自己的判断,表决算法可以使“多数规则”,“首选组件”或者是其他算法,用于纠正算法的错误操作或者处理器的操作。
(2)主动冗余(热启动):所有的冗余组件都可以并行的对事件作出相应,仅使用第一个响应的组件,所以当有错误发生的时候,即使正常状态下第一个响应的组件挂掉了,其他的组件也会很快进行响应,停机事件通常为几毫秒。
(3)被动冗余(暖重启/双冗余/三冗余) :一个组件(主要的)对事件做出响应,并通知其他组件(备用的)必须进行状态更新。当错误发生时,在继续提供服务前,系统必须首先确保备用状态是最新的。
(4)备件:组件出现故障时,对组件重新启动为适当的软件设置,并对其状态进行初始化。此类战术包括:shadow模式,状态再同步,检查点/回滚。
(5)Shadow操作:以前出现故障的组件可以在短时间内以“shadow模式” 运行,以确保在恢复该组件前,模仿工作组件行为。
(6)状态再同步:主动和被动冗余战术要求恢复的组件在重新提供服务前更新其状态。更新的方法取决于可以承受的停机时间、更新的规模以及更新所要求的消息的数量。
(7)检查点/回滚:检查点就是记录所创建的一致状态,或者是定期进行,或者是对具体事件做出响应。有时系统会以-种不同寻常的方式出现故障,可检测到其状态不一致。在这种情况下,应该使用上一个一 致状态检查点和拍了快照后所发生的事务日志来恢复系统。
5.错误预防:
(1)从服务中删除:从操作中删除系统的一个组件,以执行某些活动来预防预期发生的故障。比如说在连接数据库,进行完操作之后,需要对连接组件进行关闭,防止重复开启发生故障。
(2)事务:对进程中发生错误的步骤及时发现并撤销,防止数据收到影响。这个在开启和数据库的连接和关闭的时候需要注意,进行操作前,需要判断连接是否打开或关闭。
(3)进程监视器: 一旦检测到进程中产生错误,监视进程就会删除非执行进程,并为该进程创建一个新的实例。我们在windows系统中常见,比如用word打开一个pdf文件卡住的时候,可以打开任务管理器,强制关闭这个进程,然后重新打开。
二、可修改性
1.概念:
指系统或软件的能够快速地以较高的性价比对系统进行变更的能力
两个关注点:可以修改什么?何时以及谁进行修改?
2.引起软件可修改性的因素:
(1)用户需求:这里就要看“需求、成本、修改”三者之间的关系了;需求无处不在,时时刻刻产生。判别一个需求的重要性来自于它对系统的成本产生的影响,如果严重影响了系统带来的的收益,那必须对系统进行修改,如果一部分相对于系统来说微不足道,则可以选择性不改。
(2)系统内在需求
3.战术分析:
(1)局部化变更:局部化意味着实现“模块化”思想,也就是设计模式中的“单一职责原则”的设计原则。通俗的来讲就是一个模块只完成一个部分,使每一个模块责任单一,防止职责过多引起整体变更时的繁琐,复杂,主要表现在类、函数、方法和接口的时候,实现“高内聚,低耦合”。
(2)防止连锁反应
连锁反应定义:我们平时编程,无论是写函数还是写类,都需要被其他类还是函数调用,修改此函数或类就会影响到调用他的函数,这就是连锁反应。
防止连锁反应的方法:
①信息隐藏。信息隐藏就是把某个实体的责任分解为更小的部分,并选择使哪些信息成为公有的,哪些信息成为私有的。
②维持现有的接口。该战术的模式包括添加接口、添加适配器、提供一个占位程序。
③限制通信路径。限制与一个给定的模块共享的模块,减少联系,一旦变更影响会小很多。
④使用仲裁者。插入仲裁者来管理依赖之间的关系,就比如数据库的使用,通过数据库来管理不同的数据信息。
(3)推迟绑定时间
推迟绑定时间。将有可能的修改,尽量用配置文件,或者其他后期让非开发人员可调整的方式实现。
①将数据库可能发生的修改放在c3p0-config.xml配置文件中,可以减少部署时间,甚至没有变更基础的人员也可以实现对数据库配置的修改。
②框架级可修改性:平台代码、应用代码、后台模块代码分离。
③根据场景、调用后台模块出参入参可配原性修改,服务变更无需通过编码即可修改。
三、性能
1.概念:
性能是指系统的响应能力----即对外部刺激(事件)做出反应时所需要的时间或在某段时间内所处理的事件个数。
一般用等待时间、处理期限、系统吞吐量、响应抖动(等待时间的变化)、未处理事件(由于系统太忙无法响应)、丢失数据(由于系统太忙)等指标了解系统性能。
2.影响响应时间的因素:
(1)资源消耗:资源包括CPU、数据存储、网络通信带宽和内存等;资源消耗是指实际需要耗费的时间;比如:数据的增删改查,CPU进行大量的加减运算等等。
(2)闭锁时间:由于资源争用、资源不可用或长时间计算导致事件无法处理,这是指计算机可能等待的时间。最常见的就是多个进程同时操作一个数据,写操作正操作此数据,读操作只能等待,必须等写操作解锁,读操作才能进行,这就会产生等待时间。
3.战术分析:
(1)资源需求——分析影响性能的资源因素
需求的两个特性:
资源流中事件之间的时间间隔;
每个请求所消耗的资源。
①减少处理一个事件流所需要的资源:提高计算效率;减少计算开销
②减少所处理事件的数量:管理事件率,减少需求;控制采样频率。
③控制资源的使用:限制执行时间;限制队列大小
(2)资源管理——提高资源的应用效率
可以通过资源管理减少响应时间。
①引入并发:通过并行处理,减少闭锁时间;
②维持数据或计算的多个副本:维持副本可以减少相同的计算;
③增加可用资源:比如增加CPU速度、增加内存等。
(3)资源仲裁——解决资源的争用
当存在资源争用时,必须对资源进行调度,以使资源协调一致的运行,以减少闭锁时间。调度的标准包括:最佳的资源使用、请求的重要性,最小化所使用资源的数量,使等待时间最少等。
①先进先出,同等看待每个资源
②固定优先级,事先为某个事件分配优先级,分配的策略为:
语义重要性:每个流都根据生成它的任务的某个与领域特性被静态地分配一个优先级。这种调度在大型机系统中,其中领域特性是任务启动的时间。
时限时间单调:时限时间单调是一种静态优先级分配,它将较高的优先级分配给具有较短时限时间的流。在调度的不同优先级流具有实时时限时间时,使用该调度策略。
速率单调:速率单调是周期流的一种静态优先级分配,它将较高的优先级分配给具有较短周期的流。
总结而言,固定优先级是:提前已分配,并按此优先级顺序进行排队
③动态优先级:运行时分配优先级,分配的策略为:
轮转:轮转是一种调度策略,它对请求进行排序,然后在允许的时候,把资源分配给该排序中的下一个请求。
时限时间最早优先:最早截止期限优先(EDF)调度根据截止期限动态分配优先级。截止期限越早,优先级越高;截止期限越晚,优先级越低。
动态优先级调度算法是指在创建进程之初,先赋予其一个优先级,然后其值随着进程的推进或等待时间的增加而改变,以便获得更好的调度性能。
④静态调度:系统非运行时确定资源的分配顺序
四、安全性
1.概念:
安全性是衡量系统在向合法用户正常提供服务的情况下,阻止非授权使用的能力。并刻画如下属性:
认可:交易不能被交易的任何一方拒绝。
保证:交易的各方是所声称的人的属性。如当客户发送一个信用卡的卡号到商家时,该商家就是用户所认可的商家。
审核:系统的内部跟踪属性。如客户转账时,系统会把转账过程记录下来。
机密性:未经授权不能访问。
可用性:系统用于合法用途的属性。
2.攻击:
试图突破安全防线的行为被称为“攻击”。
攻击有以下三种方式:
(1)未经授权试图访问数据或服务。
(2)未经授权试图修改数据。
(3)试图使用系统拒绝向合法用户提供的服务。
3.抵抗攻击:
防止攻击队系统和数据造成影响乃至破坏
(1)用户的证实:通过账号密码,指纹等识别手段,确定现在正在访问系统的人是真正的用户
(2)用户的授权:管理用户权限,确认用户的操作在自己的权限内
(3)维持数据的保密性:数据传输时进行加密
(4)维持数据的完整性:利用MD5码等校验文件是否未修改。MD5码是和文件内容相关的字符串,文件的任何一点改动理论上都会导致MD5码变化
(5)减少暴露:关闭不安全的或没必要的端口,自启动服务和无线路由SSID等
(6)访问控制:通过白名单,限制可以访问的用户或其他主机
4.检测攻击:
尽早发现正在进行地攻击,确保能够及时作出回应如关闭主机等。系统监测一般是软件和人工结合,既有自动检测系统检测异常,也有安全专家人工复核或检查
5.从攻击中恢复:
在被攻击并产生了影响后,尽快地从异常情况中恢复
(1)恢复状态:采用提高可用性的一些手段,如备份等,提高恢复速度
(2)攻击者的识别:找出并确定攻击者,震慑潜在的攻击者
五、可测试性
1.概念:
可测试性指通过测试揭示软件缺陷的难易程度。
可测试性的响应度量处理的是测试在发现缺陷方面的效率以及想要达到某个期望的覆盖范围,需要用多长时间进行测试。
2.战术分析:
记录/回放:指将捕获跨接口的信息,并将其作为测试专用软件的输入。
将接口与实现分离:将接口与实现分离允许实现的代替。占位实现允许在缺少被占位组件时,对系统的剩余部分进行测试有了标准的接口,进行有效的隔离,能够极大程度的减少测试员的工作量,模块化测试,单元测试极大地减少了测试过程中用例的原则。
特化访问路线/接口:具有特化的测试接口允许通过测试工具并独立于其正常操作,来捕获或指定组件变量的值
内部监视器:组件可以维持状态、性能负载、容量、安全性或其他可通过接口访问的信息。当监视状态被激活时可以记录事件。
六、易用性
1.概念:
关注的是对用户来说完成某个期望任务的难易程度。分为以下几个方面:有效性;错误避免及错误处理;用户自信和满意度;可学习性
2.战术分析:
(1)运行时:
战术:
1.维持任务的一个模型。
2.维持用户的一个模型。
3.维持系统的一个模型。
表现方式:
用户主动:用户主动进行对系统的请求,如调用help命令和撤销操作。
系统主动:在用户操作结束后,主动检测错误,下面为eclipse自动检测分号,发现分号不存在,向用户报错。
混合主动:系统实时根据用户的动作给出一定的帮助,如编程时的关键词帮助。
(2)设计时:
将用户接口与应用的其余部分分离开来,软件设计模式中的高内聚低耦合。
总结
软件质量属性的每一个方面都有很多的内容,我只是在这里浅尝而止,而且仍然有许多重要的质量属性我们还没有涉及到,还需要进一步更加深入的去总计和练习软件开发、架构过程中对于质量属性的运用和要求,更加熟练的运用到软件开发过程中来。。