一、整体理解
首先了解一下可用性战术的目标:可用性战术将会组织错误发展为故障,或者至少能够把错误的影响限制在一定范围内,从而是系统恢复成为可能。
上面是使用了一些官方的话来说明了可用性战术的目标,接下来说一下我对可用性战术的目标的理解。
我认为,可用性战术的目标就是尽一切可能让运行的程序不会出错,或者说如果出错也不要让使用者看出来,在这样的基础上,程序通过各种方式,让其自己回归正常运行的轨道。
说完可用性战术的目标,就该谈谈使用怎样的方法去达到这个目的了。
课程中讲到了三个方法,一是错误检测:用来检测故障的某种类型的健康监视;二是自动恢复:
检测到故障时某种类型的恢复;三错误预防:阻止错误演变为故障。然而我把他们这三点归结为一句话:有则改之,无则加勉。其实,事实也正是如此,有错就要改正,防止酿成大错,无则加勉,就是实时检查自己,是否有出错的地方。
说完理论上的东西,我来结合我的代码谈一下,可用性战术在我代码中的实现,再有就是我代码中目前应该完善的东西。
二、错误检测
首先说一下错误检测,这一点不论我们多不专业,我相信多多少少的会在代码中有所涉及,就像我们连接数据库是,常常用到的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;
进程监听器:
整体来讲,可用性战略在我的代码体现的并不是很多,也就是在错误检测和错误预防上稍有体现,由于本人对自动恢复这一部分理解和掌握的并不是很到位,所以这也造成了我代码上的缺陷吧。