质量属性之可用性在代码层的实现战术

软件质量属性之可用性及其战术分析
董奥
(石家庄铁道大学,河北省石家庄市,050043)

摘 要

架构设计的目标应当为满足架构需求的质量属性寻找适当的战术,质量需求指定了软件的响应,以实现业务目标。我们感兴趣的是设计使用设计模式、架构模式或架构策略创建设计的“战术”。 以可用性为例,我们在评测软件质量的好坏时,往往重视该软件产品的可用性,了解软件在错误检测,错误恢复和错误预防上的具体表现如何,从而作为软件评价质量的一个重要依据。

关键词:可用性,错误检查,错误恢复,错误预防

引言:

经过软件体系架构这门课的学习,了解了软件质量的六大属性,而作为六大属性中不可缺少的属性——可用性,自然也是十分重要。当前软件对于用户最直观的体验就是可用性的指标,包括程序响应的正确性,程序运行的流畅性,程序的少错误性与出现错误的自动恢复机制等。这些都是影响用户体验最直接的因素,本文将着重针对影响可用性的三大方面进行阐述,即错误检测、错误恢复与错误预防。

一、错误检测

用于识别错误的3个战术是命令/响应、心跳和异常。

1、命令/响应

一个组件发出一个命令,并希望在预定义的时间内收到一个来自审查组件的响应。可以把该战术用在共同负责某项任务的一组组件内。客户机也可以使用这种战术,以确保服务器对象和到服务器的通信路径在期望的性能边界内操作。可以用一种层级形式组织“命令/响应”错误探测器,其中最底层的探测器对与其共享一个处理器的软件进程发出命令,较高层的错误探测器对较低层的探测器发出命令。与所有进程发出命令的远程错误探测器相比,这种战术所使用的通信带宽更少。

2、心跳

一个组件定期发出一个心跳消息,另一个组件接收听该信息。如果心跳失败,则假定最初的组件失败,并通知错误纠正组件。心跳还可以传递数据。例如,自动柜员机定期向服务器发送一次交易日志。该消息不仅起到心跳的作用,而且传送了要处理的数据。

3、异常

识别错误的一个方法就是遇到了异常。

命令/响应和心跳战术在不同的进程中操作,异常战术在一个进程中操作。异常处理程序通常将错误在语义上转换为可以被处理的形式。

在Java中可以通过try-catch语句块容易地实现异常捕获:

public static Connection getConn () {
        Connection conn = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");//加载驱动
            conn = DriverManager.getConnection(db_url, db_user, db_pass);//连接数据库
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return conn;
    }

二、错误恢复

错误恢复由准备恢复和修复系统两部分组成。

1、表决。

运行在冗余处理器上的每个进程都具有相同的输入,它们计算发送给表决者的一个简单的输出值。如果表决者检测到单处理器的异常行为,那么就中止这一行为。表决算法可以是“多数规则”或“首选组件“或其他算法。该方法用于纠正算法的错误操作或者处理器的故障,通常用在控制系统。每个冗余组件的软件可以由不同的小组开发,并且在不同平台上执行。稍微好一点情况是在不同平台上开发一个软件组件,但是这样的开发和维护费用非常昂贵。

2、主动冗余(热重启)

所有的冗余组件都以并行的方式对事件做出响应。因此他们都处在相同的状态。仅使用一个组件的响应,丢弃其他组件的响应。错误发生时,使用该战术的系统停机时间通常是几毫秒,因为备份是最新的,所以恢复所需要的时间就是切换时间。

3、被动冗余(暖重启/双冗余/三冗余)

一个组件(主要的)对事件做出响应,并通知其他组件(备用的)必须进行状态更新。当错误发生时,在继续提供服务前,系统必须首先确保备用状态是最新的。该方法也用在控制系统中,通常情况是在输入信息通过通信通道或传感器到来时,如果出现故障必须从主组件切换到备用组件时使用。

4、备件

备用件是计算平台配置用于更换各种不同的故障组件。出现故障时,必须将其重新启动为适当的软件配置,并对其状态进行初始化。定期设置持久设备的系统状态的检查点,并记录持久设备的所有状态变化能够使备件设置为适当的状态。这通常用作备用客户机工作站,出现故障时,用户可以离开。该战术的停机时间通常是几分钟。

5、Shadow操作

以前出现故障的组件可以在短时间内以“shadow模式”运行,以确保在恢复该组件前,模仿工作组件行为。

6、状态再同步

主动和被动冗余战术要求恢复的组件在重新提供服务前更新其状态。更新的方法取决于可以承受的停机时间、更新的规模以及更新所要求的消息的数量。

7、检查点/回滚

检查点就是记录所创建的一致状态,或者是定期进行,或者是对具体事件做出响应。有时系统会以一种不同寻常的方式出现故障,可检测到其状态不一致。在这种情况下,应该使用上一个一致状态检查点和拍了快照后所发生的事务日志来恢复系统。

三、错误预防

1、从服务中删除

该战术从操作中删除了系统的一个组件,以执行某些活动来防止预期发生的故障。一个示例就是重新启动组件,以防止内存泄露导致故障的发生。如果从服务中删除是自动的,则可以设计架构策略来支持它。如果是人工进行的,则必须对系统进行设计以对其提供支持。

2、事务

事务就是绑定几个有序的步骤,以能够立刻撤销整个绑定。如果进程中的一个步骤失败的话,可以使用事务来防止任何数据受到影响,还可以使用事务来防止访问相同数据的几个同时线程之间发生冲突。

3、进程监视器

一旦检测到进程中存在着错误,监视进程就可以删除非执行进行,并为该进程创建一个新的实例,就像在备件战术中一样,初始化为某个适当的状态。

四、总结

总体来说,可用性在代码层次使用不多,但重要性是不可忽视的。对错误的处理也是我们需要格外关注的,错误的检测、处理与预防。软件质量属性的每一个方面都有很多的内容,我们只能浅尝而止,而且仍然有许多重要的质量属性我们还没有涉及到。软件设计时应该将“设备相关程序”与“设备无关程序”分开,将“功能模块”与“用户界面”分开。现在你是否也知道了常人是怎么评价软件的?没错,作为软件的用户我们只关心“好不好用”,它包含在这些专业指标之中,是其综合作用的结果。

参考文献:
[1] 林锐《软件工程思想》
[2] naughty,软件中的质量属性(一),https://my.oschina.net/taogang/blog/224658
[3] naughty,软件中的质量属性(二),https://my.oschina.net/taogang/blog/225513
[4] 软件架构设计---架构需求与软件质量属性,https://blog.csdn.net/hu19930613/article/details/82749338

posted @ 2021-04-10 10:52  大雪初晴丶  阅读(123)  评论(0编辑  收藏  举报