先摆概念:系统运行中,如果有错误发生,那么系统立即结束,这种设计就是快速失败(fail-fast)。系统运行中,如果有错误发生,系统不会停止运行,它忽略错误(但是会有地方记录下来),继续运行,这种设计就是失败安全(fail-safe)。
以dubbo为例,在dubbo中,有一个AbstractClusterInvoker,其中有两个实现类FailfastClusterInvoker和FailsafeClusterInvoker
在dubbo的配置中,有一个cluster的属性,里面可以填“failfast”和“failsafe”,分别会在异常发生的时候执行FailfastClusterInvoker和FailsafeClusterInvoker。
看下这两个实现类之间的源码区别:
我们可以看到,在failfast的实现类中,如果发生了异常,会立即把它抛出去。
而在failsafe的实现类中,还是会返回一个空结果给调用方,然后打印错误日志,使得在异常发生的时候,程序不会终止,会继续执行下去。
对于快速失败和失败安全其实更多的是用在了集合中。