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


    一、整体理解

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

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

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

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

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

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

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

    二、错误检测

      首先说一下错误检测,这一点不论我们多不专业,我相信多多少少的会在代码中有所涉及,就像我们连接数据库是,常常用到的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;

    进程监听器:

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

  • 相关阅读:
    文艺青年、普通青年、2b青年到底是什么意思?
    CMake快速入门教程:实战
    shell脚本中变量$$、$0等的含义
    工作上的C/C++相关
    C/C++的一些备忘
    shell基础二十篇 一些笔记
    C++中this指针的用法详解
    【C++11】新特性——auto的使用
    一个很不错的bash脚本编写教程
    容器
  • 原文地址:https://www.cnblogs.com/hwh000/p/12389989.html
Copyright © 2020-2023  润新知