可用性战术之代码层面分析

首先,我们先来了解一下什么是可用性战术:

可用性战术将会阻止错误发展为故障,或者至少能够把错误的影响限制在一定范围内,从而使系统恢复成为可能。

可用性战术维护可用性的方法有错误检测、自动恢复、错误预防。

以上是官方的解释,但在我看来:

可用性战术的目标就是尽一切可能让运行的程序不会出错,或者说如果出错也不要让使用者看出来,在这样的基础上,程序通过各种方式,让其自己回归正常运行的轨道。尽量避免错误的发生,或者不要让错误形象到程序的正常运行。

课程中讲到了三个方法,一是错误检测:用来检测故障的某种类型的健康监视;二是自动恢复:检测到故障时某种类型的恢复;三错误预防:阻止错误演变为故障。

然而把三点归结为一句话就是:有则改之,无则加勉。实际上,事实也正是如此,有错就要改正,防止酿成大错,无则加勉,就是实时检查自己,是否有出错的地方。要知道,在程序中的一个小错误,可能造成的损失将是无法估量的。

说完理论上的东西,我来结合我的代码谈一下,可用性战术在我代码中的实现,还有就是我代码中目前应该完善的东西。

1.错误检测:

   首先说一下错误检测,这是最基本也是最重要的一点,要想进行代码的检测、完善,首先必选要学会如何进行错误检测,特别是在一个比较大的项目中,如何快速准确的找到错误显得尤为重要。这一点不论我们多不专业,我相信多多少少的会在代码中有所涉及,就像我们连接数据库是,常常用到的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;
    }

信号相应代码示例:

void sigdemo(int sig)
{
    printf("Receive a signal:%s\n",strsignal(sig));
}
 
int main()
{
    if(signal(SIGINT,sigdemo) == SIG_ERR)
  {
    perror("signal()");
    return ;
  }
    printf("Main started.\n");
    pause();//wait a signal.
}

2.自动恢复:

  错误恢复的战术包括表决、主动冗余、被动冗余、备件、状态再同步等等。

       本人理解的就是通过备份或者日志信息进行重返故障以前的样子,案列:数据库原理时数据库通过日志等方式进行恢复;word文档中的撤销操作。

3.错误预防

错误预防的战术包括:从服务中删除、事务和进程监听器。其中从服务器删除,我认为就像是mysql连接完成,使用用完成后再进行关闭(防止下次使用时报错);其中事务接触的还是比较多的,即在数据库的操作中,定义一个事务,其中包含的语句全部执行或者全部不执行,操作的所有部分一起成功或者全部失败并恢复;至于进程监听器我认为就像是windows中的任务管理器一样,实时监听任务的各项资源占用等情况。

服务中删除部分代码示例:

public class DBUtil {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;
    }
    public static void close (Statement state, Connection conn) {
        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

进程监听器:例如我们Windows系统中常用到的任务管理器

 

posted @ 2021-04-09 10:35  小赵不吃溜溜梅  阅读(94)  评论(0编辑  收藏  举报