转自: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编程中,**Fail Fast**机制是一项重要的设计原则,特别是在处理集合时尤为关键。它主要用于确保数据结构的一致性和完整性,通过快速检测并报告...
Fail-safe机制与Fail-fast机制的比较分析 在多线程并发操作中,Fail-safe机制和Fail-fast机制是两种常见的失败处理机制,它们的作用和实现原理有所不同。 Fail-fast机制是一种快速失败机制,在集合遍历过程中,...
Fail-Fast机制是一种Java集合框架中的设计策略,主要用于在多线程环境下确保程序的正确性和稳定性。当一个线程在遍历集合时,如果另一个线程对集合进行了结构上的修改,Fail-Fast机制会立即抛出`...
Java中的Fail-Fast机制详解 Java中的Fail-Fast机制是一种错误检测机制,当多个线程对集合进行结构上的改变操作时,有可能会产生Fail-Fast机制。这种机制是Java集合框架的一部分,可以帮助检测并发修改引发的错误。 ...
Java fail-fast 机制详解 Java fail-fast 机制是一种系统设计理念,旨在快速检测和报告可能的故障情况,以便尽早采取措施避免更大的错误。这种机制的主要思想是,在系统设计时考虑到异常情况,并在检测到错误时...
Java Collections中的Fail Fast机制.pdf Java 推荐读物.pdf Java 推荐读物与源代码阅读.pdf JDBC-ODBC使用Excel作数据源.pdf JDBC中操作Blob、Clob等对象.pdf JDBC中驱动加载的过程分析(上).pdf JDBC中驱动加载的...
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所...
Java Collections中的Fail Fast机制.pdf Java 推荐读物.pdf Java 推荐读物与源代码阅读.pdf JDBC-ODBC使用Excel作数据源.pdf JDBC中操作Blob、Clob等对象.pdf JDBC中驱动加载的过程分析(上).pdf JDBC中驱动加载的...
使用迭代器的另一个关键特性是快速失败(Fast-Fail)机制。当多个线程同时遍历一个集合并修改集合状态时,如果没有适当的同步控制,可能会导致迭代器抛出ConcurrentModificationException。这是因为迭代器在创建时会...
【前端开源库-hydro-fail-fast】是一个专为前端开发者设计的开源库,其核心功能是在测试过程中实现“液压快速失效”机制。这个概念源于工程领域,尤其在液压试验中,当系统首次检测到异常或故障时,为了保护设备和...
含Collections Framework中的算法 Java Collections中的Fail Fast机制 给学习J2EE的朋友一些值得研究的开源项目 由一个简单的程序谈起(设计相关)
Dubbo提供了一套完整的容错机制,包括Failover(失败自动切换)、Failfast(快速失败)、Failsafe(失败安全)、Fallback(失败回调)、Retry(重试)等策略。 1. Failover:这是默认的容错策略,当调用失败时,会...
Fail-fast Iterator是一种快速响应集合修改的机制。如果在遍历过程中,集合的结构被修改(例如添加、删除元素或改变元素位置),Fail-fast Iterator会立即抛出`ConcurrentModificationException`。这是因为Fail-fast...
SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现...请求处理超时 FailFast 机制 用户请求处理器 ( UserProcessor ) 双工通信
( protocol-skeleton )命令与命令处理器编解码处理器心跳触发器3、私有协议定制实现 - RPC 通信协议 ( protocol-implementation )RPC 通信协议的设计灵活的反序列化时机控制请求处理超时 FailFast 机制用户请求...
掌握 Iterator 的 fail-fast 、fail-safe 机制 ArrayList() 会使用长度为零的数组 ArrayList(int initialCapacity) 会使用指定容量的数组 public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组...