zoukankan      html  css  js  c++  java
  • 可用性战术之代码层面分析

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

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

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

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

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

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

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

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

    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
    ",strsignal(sig));
    }
     
    int main()
    {
        if(signal(SIGINT,sigdemo) == SIG_ERR)
      {
        perror("signal()");
        return ;
      }
        printf("Main started.
    ");
        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系统中常用到的任务管理器

  • 相关阅读:
    luogu P2639 [USACO09OCT]Bessie的体重问题Bessie's We…
    1001. 害死人不偿命的(3n+1)猜想 (15)
    1003. 我要通过!(20)
    1002. 写出这个数 (20)
    《C语言程序设计(第四版)》阅读心得(一)
    1006. 换个格式输出整数 (15)
    背包问题之多重背包
    背包问题之完全背包
    背包问题之0-1背包
    动态规划例题
  • 原文地址:https://www.cnblogs.com/zwx655/p/14636117.html
Copyright © 2011-2022 走看看