关于如何提高系统的可用性和易用性
通过阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章。分析如何对系统添加功能来提高系统的可用性和易用性。
一个网站特别是一个大型网站的是否可用性往往会直接影响到公司的形象和利益,在为用户服务的时候一个小小的环节:DNS被劫持,网站服务器出现宕机,硬盘损坏,程序有bug等等原因,都会使整个网站受到意想不到的危害,这可能会直接或者间接的导致莫大的损失,而有些损失是一个公司无法承受的。所以可用性对一个网站来说是至关重要的,对于网站的可用性考核也成为了网站架构设计的重要标志。往往在架构设计与评审会议上,关于系统可用性的讨论与争执是最花费时间和精力的。有一些企业级的应用系统会采用昂贵的软硬件设备来提高系统的可用性。而在系统程序的设计中使用一个号的分层架构模型也是能增强系统的可用性。
例如在我们的某个系统当中,对于应用层,服务层和数据层要有一个好的规划。我们现在就需要一个很好的规划,首先在数据层的持久性进行设计。对于我们的一个需求对象,里面有很多属性、字段,我们首先需要用一个类将其封装起来,也就是domain,再者我们需要利用多肽实现面向接口编程,对持久层(Dao和Impl)的实现。这就是数据持久层的规划,数据层是直接与用户信息进行交互的,所以这个是非常重要的。在持久层的方法的实现的同时,我们要考虑到重要的线程安全问题,在我们的程序设计当中就要保证我们在处理事务的时候使用的是同一个session对象,就比如说银行转账,我们必须要保证在数据层,服务层和应用层拿到同一个事务对象,才能保证这个事务的完整实现。那么这样我们就可以像很多框架中用到的threadLocal.get()来从线程局部变量获取session,保证同一个线程获取到的是同一个session对象,保证我们事务的可用性。
对于异常的检测,我们首先关注的是与数据库交互不成功而产生的异常,在数据持久层中当操作数据库出现异常时,需要捕获这个异常并且回滚数据,将异常处理掉。在hibernate框架中实现了延迟加载,为了提高与数据库交互的性能,当在真正需要数据的时候,才真正执行数据加载操作。也就是说在使用的时候,才会发出sql语句进行查询。但是有这样一个问题,在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已经关闭,就会出现异常。而对于我们来说并不希望它报出这样的异常,我们希望在使用加载这些数据的时候session是一直开着的。我们可以使用spring为我们提供的opensessioninview,它的主要功能是用来把一个hibernate session和一次完整的请求对应的线程绑定。当view层逻辑完成之后,再通过Filter的doFilter方法自动关闭session。
对于易用性,用户的注意力是有限的的资源,在功能设计上不要浪费使用者的时间,应该减轻其工作强度和没有必要的操作,同时又要提高效率。你要将添加的任何一项功能有可能是用户找到另外一项功能的绊脚石。如果必须添加一些功能,试图替换掉另外一项类似的功能是值得考虑的。经常需要为了一些功能的易用性牺牲另外一些功能是必要的。系统功能的个性化裁减、配置、收藏功能是必要的。我们应该多使用ajax,在用户进行页面操作时,局部刷新而不整个页面刷新。再者我们在查询一条条数据时适当的分页,并且提供一些方便的操作比如输入页面跳转,修改一条数据时停留在当前页码。添加一条数据时自动转到最后一页方便查看添加后的数据。