(课)如何在代码层实现可用性战术

一、整体理解

  首先了解一下可用性战术的目标:可用性战术将会组织错误发展为故障,或者至少能够把错误的影响限制在一定范围内,从而是系统恢复成为可能。

  上面是使用了一些官方的话来说明了可用性战术的目标,接下来说一下我对可用性战术的目标的理解。

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

        说完可用性战术的目标,就该谈谈使用怎样的方法去达到这个目的了。

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

  检测到故障时某种类型的恢复;三错误预防:阻止错误演变为故障。然而我把他们这三点归结为一句话:有则改之,无则加勉。其实,事实也正是如此,有错就要改正,防止酿成大错,无则加勉,就是实时检查自己,是否有出错的地方。

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

二、错误检测

  首先说一下错误检测,这一点不论我们多不专业,我相信多多少少的会在代码中有所涉及,就像我们连接数据库是,常常用到的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
",strsignal(sig));
}
 
int main()
{
    if(signal(SIGINT,sigdemo) == SIG_ERR)
  {
    perror("signal()");
    return ;
  }
    printf("Main started.
");
    pause();//wait a signal.
}

三、自动恢复

  错误恢复的战术包括表决、主动冗余、被动冗余、备件、状态再同步等等。本人理解的就是通过备份或者日志信息进行重返故障以前的样子,就像学数据库原理时数据库通过日志等方式进行恢复差不多吧。

四、错误预防

  错误预防的战术包括:从服务中删除、事务和进程监听器。其中从服务器删除,我认为就像是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();
            }
        }
    }
}

事务代码示例:

     try {
            if(conn != null) {
                pstmt = conn.prepareStatement(sql);
                pstmt.executeUpdate();
            }
        }catch(SQLException e) {
            e.printStackTrace();
        }
        return pstmt;

进程监听器:

  整体来讲,可用性战略在我的代码体现的并不是很多,也就是在错误检测和错误预防上稍有体现,由于本人对自动恢复这一部分理解和掌握的并不是很到位,所以这也造成了我代码上的缺陷吧。

原文地址:https://www.cnblogs.com/hwh000/p/12389989.html