`

Fail Fast机制

阅读更多

转自:http://geeklu.com/2010/07/fail-fast/

Fail Fast从字面上看是“快速失败”的意思,或者叫做“速错”,其含义就是让可能发生的错误尽早的被发现。
无论是人类,还是代码这个道理都是适用的。我们在做事的时候,犯错误是很常见的,但是我们应该尽量使得错误发生之初就被发现,并找出原因进行纠正。一开始不重视或者变相的处理了,这会使得错误延后,反而使得损失增大。
还有个事例就是创业,我们就要抱着“如果要失败那就快点”的心态,加快自己前进的步伐。
哈哈,说远了,今天主要说的是程序设计中的Fail Fast。

在我们软件开发的过程中,当碰到问题了,我们第一步就是重现问题,然后进行debug,找出问题的原因,但往往有些bug隐藏的比较深,经过n次特定的操作的在特定的环境下才会重现,或者出错后,报错的stack traces的没有指出错误的真正起点。
所以我们设计一个Fail Fast的系统显得很重要了。
很多人设计的系统,为了增强系统的健壮性,自动的将系统中出现的问题处理掉,并继续运行,但是在未来的某个时间引发奇怪的错误。
而fail fast的系统的做法却是相反的,当有问题发生,立即出错,并将出错信息显示出来。这样bug就很容易被发现,而不会进入到最终的产品中。
比如下面的代码片段,假设maxConnections从一个配置文件中读取最大连接数这个数值,
当发现读取到的值为null的时候,我们一般有两种做法,直接返回null或者返回一个默认值。
(在JDK的HashMap的实现中也遵循fail fast原则,当获取遍历游标iterator之后,如果别的线程对map进行修改等操作会抛出异常的,因为这样会使得算法执行的环境发送变化,导致遍历过程中可能发生错误。)

public int maxConnections() { 
string property =getProperty("maxConnections");
 if (property == null) {
      return 10;
  } else {
     return property.toInt();
 }
}
 

但是这在fail fast的原则下则应该如下

public int maxConnections() { 
      string property =getProperty("maxConnections"); 
      if (property == null) {
         throw new 
                    NullReferenceException (
                          "maxConnections property not found in"
                          + this.configFilePath);
      } else {
        return property.toInt();
     }
}
 
假设上面的代码是某个web应用的一部分,当某次升级的时候,不小心将maxConnections写错了,或者不小心删除了,那么如果采取默认值的情况的话,可能程序不会报错,但是运行之后可能会发现因为连接数变小了而使得应用很慢,且这个错误不便于查找,但是如果直接抛异常的话,错误就显而易见了。

在很多时候,在系统中我们需要建立自己的错误异常处理体系,比如编写一系列的assert检测方法,并定义自己的异常类型,在正确的地方抛出异常。

fail fast的方式可能使你感觉到软件的健壮性不是很好,的确它让我们更容易的找到错误,那么当我们最终将软件部署成产品的时候,还需要这样的写法么,很多时候我们在发布的时候都回将assert关闭,为了避免因为错误使得程序crash掉,但是真的有必要这么做么,其实没有必要,有时候线上的错误很少会发生,如果发生了错误,而不直接显示,那么我们开发人员找错误的时候,首先就需要重现问题,而这个可能很难重现出来。当然我们可以使得异常的方式处理的友好些。比如跳出一些错误异常窗口,然后询问是否将异常发生时的状态和错误信息发送给开发人员。
这样将有助于软件bug的修复。

参考:http://www.martinfowler.com/ieeeSoftware/failFast.pdf

 

        http://geeklu.com/2010/07/fail-fast/

分享到:
评论

相关推荐

    Java Collections中的Fail Fast机制

    Java Collections中的Fail Fast机制

    Fail-Fast机制1

    Fail-Fast机制 由于HashMap(ArrayList)并不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map(这里的修改是指结构上的修改

    由ArrayList来深入理解Java中的fail-fast机制

    fail-fast俗称快速失败,是在多线程进行迭代操作时产生冲突的一种异常抛出机制,下面我们就由ArrayList来深入理解Java中的fail-fast机制.

    【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用.doc

    【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用.doc

    老生常谈java中的fail-fast机制

    下面小编就为大家带来一篇老生常谈java中的fail-fast机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Iterator与fast-fail机制.pdf

    Iterator与fast-fail机制

    java高手的文章合集3/3

    Java Collections中的Fail Fast机制.pdf Java 推荐读物.pdf Java 推荐读物与源代码阅读.pdf JDBC-ODBC使用Excel作数据源.pdf JDBC中操作Blob、Clob等对象.pdf JDBC中驱动加载的过程分析(上).pdf JDBC中驱动加载的...

    解析Java的迭代器中的fast-fail错误检测机制

    fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所...

    java高手的文章合集 pdf格式

    Java Collections中的Fail Fast机制.pdf Java 推荐读物.pdf Java 推荐读物与源代码阅读.pdf JDBC-ODBC使用Excel作数据源.pdf JDBC中操作Blob、Clob等对象.pdf JDBC中驱动加载的过程分析(上).pdf JDBC中驱动加载的...

    java高手的文章合集

    含Collections Framework中的算法 Java Collections中的Fail Fast机制 给学习J2EE的朋友一些值得研究的开源项目 由一个简单的程序谈起(设计相关)

    一不小心就让Java开发踩坑的fail-fast是个什么鬼?(推荐)

    主要介绍了Java fail-fast,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    SOFA-Bolt网络通信框架-其他

    SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现...请求处理超时 FailFast 机制 用户请求处理器 ( UserProcessor ) 双工通信

    SOFABolt-其他

    ( protocol-skeleton )命令与命令处理器编解码处理器心跳触发器3、私有协议定制实现 - RPC 通信协议 ( protocol-implementation )RPC 通信协议的设计灵活的反序列化时机控制请求处理超时 FailFast 机制用户请求...

    Java面试题-基础-集合有关的知名厂商面试题和基础复习

    掌握 Iterator 的 fail-fast 、fail-safe 机制 ArrayList() 会使用长度为零的数组 ArrayList(int initialCapacity) 会使用指定容量的数组 public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组...

    java8源码-csn-list:ArrayList、LinkedList、Vector、Stack源码分析

    Fail-Fast机制 fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。 通过modCount的值来判断是否多线程同时操作,modCount用来记录List...

    Java 集合方面的面试题

    什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator 接口?它们有什么区别? 如何使用 ConcurrentHashMap 类来实现线程安全的映射? 如何避免在多线程环境下对同一...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合详解7:HashSet,TreeSet与...

    springcloud-alibaba-demo-8-9.zip

    Failfast Cluster:快速失败。当服务调用失败后,立即报错,也就是指发起一次调用。(这种模式通常用于写操作,这种模式可以防止网络等问题导致数据重复新增,它等同于Failover Cluster retries=0) Failsafe Cluster...

Global site tag (gtag.js) - Google Analytics