可用性:可用性与系统故障及其相关后果有关。当系统不再提供其规范中所说明的服务时,就出现了系统故障。
可用性关注的方面有:1、如何检测系统故障 2、系统故障发生的频度 3、出现故障时会发生什么情况 4、允许系统有多长时间非正常运行 5、什么时候可以安全地出现故障 6、如何防止故障的发生以及故障时要求哪种通知。
可用性战术:阻止错误发展为故障,或者至少能够把错误的影响限制在一定范围内,从而使系统恢复成为可能。
可用性战术分类:
错误检测:
在代码层面我们要重视错误检测,在可能会出现错误的地方多使用错误检测方法中的异常来处理程序,将错误在语义上转换为可以被处理的形式多使用try/catch等来判断是否有错误,然后设计一些方式在错误出现后能够使系统很快的恢复正常供用户使用。
比如连接数据库的代码使用了很多try/catch来判断:
public class DBUtil{ public static String db_url="jdbc:mysql://localhost:3306/xinfang?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"; public static String db_user="root"; public static String db_password="password"; public static Connection getConn() { Connection conn=null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn=DriverManager.getConnection(db_url, db_user, db_password); System.out.println("连接数据库成功"); }catch(Exception e) { System.out.println("连接数据库失败"); e.printStackTrace(); } return conn; } public static void close(Connection conn) { if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } 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(); } } } public static void close(ResultSet rs, Statement state, Connection conn) { if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(state!=null) { try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
还可以设置命令/响应。在前端设置一个时间参数,在预定的时间内如果没有收到后台的传值则判定系统出现错误,给出相应提示。
热词分析系统:
当输入的热词没有的时候,系统不应该进入下一个页面,如果进入了下一个页面就应该是错误。应该用try/catch判断当热词没有的时候应该弹出提示框热词暂无,而我的代码没有。
词云图中可以设置命令/响应,如果在一定时间内没有加载出词云图,则运行alert(“词云图加载失败”);
然后重新刷新本页面用来重新加载词云图,解决了在不提示出现错误的时候,用户无休止的等下去,占用用户的时间,影响用户对本系统的使用。
错误恢复:
当整个系统出现致命错误的时候,可以使用代码提示用户页面崩溃是否重新加载页面,从而使系统回到正常使用的状态,达成错误恢复。防止用户不能使用本系统。
当出现故障组件可以在短时间内以"shadow模式"运行,以确保在恢复该组件之前,模仿工作组件的行为。以保证网站的正常使用。
另外错误恢复还有表决:运行在冗余处理器上的每个进程都具有相等的输入,它们计算发送给表决者的一个简单输出值。如果表决者检测到单处理器的异常行为,那么,就中止这一行为。
主动冗余
所有的冗余组件都以并行的方式对事件做出响应。仅使用一个组件的响应,丢弃其余组件的响应。错误发生时,使用该战术的系统的停机时间通常是几毫秒,因为备份是最新的,所以恢复所需要的时间就是切换时间。
被动冗余(暖重启/双冗余/三冗余)
一个组件对事件做出响应,并通知其他组件必须进行状态更新。当错误发生时,在继续提供服务前,系统必须首先确保备用状态是最新的。
备件
备用是计算平台配置用于更换各种不同的故障组件。出现故障时,必须将其重新启动为适当的软件配置,并对其状态进行初始化。
状态再同步
主动和被动冗余战术要求所恢复的组件在重新提供服务前更新其状态。更新方法取决于可以承受的停机时间、更新的规模以及更新所要求的消息的数量。如果可能的话,最好用一条消息包含该状态。增量式状态更新和两个增量之间的服务周期会导致复杂的软件。
等方式,在本系统现有功能中不太适用。
错误预防:
对本系统的热词查询步骤进行绑定形成事务,以确保用户按正常的步骤使用本系统,防止错误的发生。如果进程中的一个步骤失败的话,可以使用事务来防止任何数据受到影响,还可以使用事务来防止访问相同数据的几个同时线程之间发生冲突。
也可以通过进程监控器来监视程序是否存在错误,一旦检测到进程中存在错误,监视进程就可以删除非执行进程,并为该进程创建一个新的实例,就像在备件战术中一样,初始化为某个适当的状态。