一文让你彻底弄清failfast、failsafe、failover、failback、failsilent
背景
最近参与了部门的稳定性建设,时常会看到一些failxxxx的字眼,常见的场景如:在Java集合迭代过程中,如果集合有修改就会抛出一个ConcurrentModificationException异常,这就是一种典型的fail-fast机制。
经过查阅资料,原来这些专有名词都有一个统一的名字:容错机制。终于,借此机会对常见的容错机制进行一下总结,方便以后学习。
文章中若有本人理解或描述不当之处,欢迎老铁们指出~
fail-fast - 快速故障
在系统设计中,快速故障系统是一种可以立即报告任何可能表明故障的情况的系统。快速故障系统通常旨在停止正常操作,而不是继续尝试可能有问题的过程。此类设计通常会在操作中的多个点检查系统状态,因此可以及早发现故障。快速故障模块的职责是检测错误,然后让系统优先处理。
private SystemService systemService;public String failFast() {boolean result = systemService.executeFailFastTask();if (result) {return "success";} else {throw new RuntimeException("执行失败"); // fail-fast}
}
- Example : List集合中迭代器的next()方法,只要检测到正在遍历的集合对象进行了修改,就会立即抛出并发修改异常(ConcurrentModificationException)
public E next() {checkForComodification();// 省略下面的代码
}
final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();
}
- 总结:如果系统出现故障,就立即中止系统并抛出故障。
fail-safe - 故障安全
如果系统出现特定类型的故障(不会对系统造成伤害或影响非常小的故障),则可以忽略,因为此类故障不会造成损失或损失在可接受范围内。故障安全机制可以保证系统在故障前和故障后保持一样的安全状态。
private SystemService systemService;public String failSafe() {boolean result = systemService.executeFailSafeTask();if (result) {return "success";} else {return "failed"; // fail-safe}
}
- Example : CopyOnWriteArrayList在迭代器的实现上没有抛出 ConcurrentModificationException,从而避免了fail-fast。CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
public E next() {if (!hasNext())throw new NoSuchElementException();return (E) snapshot[cursor++];
}public boolean hasNext() {return cursor < snapshot.length;
}
- 总结:如果系统出现故障,则进行忽略,以保证系统正常运行。
fail-over - 故障转移
故障转移是系统出现故障或异常终止时切换到冗余或备用的系统。故障转移通常是系统自动进行的并且往往在没有告警的情况下运行,不需要人工干预。
private SystemService systemService;
private SystemService backupSystemService;private static boolean defaultSet = Boolean.TRUE;public String failOver() {if (defaultSet) {try {systemService.executeFailOverTask();} catch (Exception e) {//fail-over: 调用主要外部服务发生故障,则切换为备用外部服务defaultSet = Boolean.FALSE;backupSystemService.executeFailOverTask();}} else {backupSystemService.executeFailOverTask();}return "success";
}
Example : MySQL的双Master模式,节点 A 和 B 之间总是互为主备关系,如果 A 实例出现故障,则切换至从 B 实例。
总结:如果系统出现故障,则切换到备用系统。
fail-back - 故障恢复
故障恢复是指将之前处于故障状态的系统恢复到原始工作状态,主系统可用后,自动从备用系统恢复到主系统。
private static boolean needSwitchToMaster = Boolean.FALSE;public void failBack() {while (true) {if (masterSystemAvailable()) {//fail-backneedSwitchToMaster = Boolean.TRUE;break;}}
}
- Example : MySQL的双Master模式,节点 A 和 B 之间总是互为主备关系,如果 A 实例出现故障,则切换至从 B 实例。
- 总结:failover之后的自动恢复过程,切换回可用的主系统。
fail-silent - 故障沉默
故障沉默:调用服务失败后,就默认该服务一定时间内无法再对外提供服务,不再向它分配请求流量,将错误隔离开来,避免对其他服务产生影响。
private static long downDuration = 0L;/*** 省略 downDuration 的计算过程*/
public String failSilent() {if (downDuration <= 0L) {boolean result = systemService.executeFailSilentTask();if (result) {return "success";}downDuration = initDownDuration();return "failed";} else {return backupSystemService.executeFailSilentTask() ? "success" : "failed";}
}
- Example : 经常超时的服务可以使用faile-silent容错机制,防止请求堆积而消耗大量的线程、内存、网络等资源,进而影响到整个系统的稳定。
- 总结:将不可用服务进行隔离一段时间,避免影响整个系统的稳定性。
总结
参考
- https://blog.csdn.net/u011305680/article/details/79730646
- http://icyfenix.cn/distribution/traffic-management/failure.html
本文仅介绍了几种常见的容错机制,欢迎老铁们进行讨论和补充~
一文让你彻底弄清failfast、failsafe、failover、failback、failsilent相关推荐
- fail-fast 和 fail-safe 快速学习
文章目录 fail-fast(快速失败) 概念 原理 应用场景 fail-safe(安全失败) 概念 原理 应用场景 二者区别 代码示例 调试fail-fast 调试fail-safe 首选说一下这两 ...
- Dubbo2.7文档详解
本篇博文参考dubbo官方文档 本编博文参考javaguide之rpc 文章目录 一.RPC 1.1 什么是 RPC? 1.2 为什么要用 RPC? 1.3 RPC 能帮助我们做什么呢? 1.4 RP ...
- RPC框架:从原理到选型,一文带你搞懂RPC
大家好,我是华仔,RPC系列的文章是我去年写的,当时写的比较散,现在重新进行整理.对于想学习RPC框架的同学,通过这篇文章,让你知其然并知其所以然,便于以后技术选型,下面是文章内容目录: RPC 什么 ...
- 源码解读Dubbo分层设计思想
I作者:vivo互联网服务器团队-Wang Genfu 一.Dubbo分层整体设计概述 我们先从下图开始简单介绍Dubbo分层设计概念: (引用自Duboo开发指南-框架设计文档) 如图描述Dubbo ...
- dubbo扫描第三方包_今天来浅谈一下dubbo
一.什么是Dubbo接口 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- dubbo ,dubbo-provider、dubbo-consumer 配置参数说明
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. dubbo:consumer 服务消费者缺省值配置.配置类: com.alibaba.dubbo.c ...
- dubbo 相关面试题 有用
调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...
- dubbo配置参考手册
配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/&g ...
- dubbo 配置及分析
一.配置 <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifact ...
- 如何使用JMeter 对Dubbo接口进行测试
1.Dubbo介绍 (1)Dubbo说明 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说:Dubbo一个高性能的,基于 Java ...
最新文章
- sdut 2805(最小生成树)
- JQuery学习系列(九)AJAX
- 最新android 手机型号,各大安卓手机厂商Android 10系统更新汇总,你的机型支持吗?...
- dos进入/退出某文件夹
- html中免费的四级联动,利用JS实现省市区街道四级联动插件
- P3085,jzoj3234-[USACO13OPEN]阴和阳【点分治】
- centos7 关闭selinux_Devops之LDAP部署安装(centos7+openLDAP+PhpLDAPAdmin)
- (二叉树DFS)天平UVa 839
- android可以定义函数吗,Android自定义view 你所需要知道的基本函数总结
- Myeclipse打断点太多,不知道怎么一次性全删除
- 达“超人”水平?强化学习得这么用!
- python---之[::-1]
- Andorid中的dex文件使用dex2jar工具反编译
- vrep系列教程(一)——熟悉vrep
- 三角形花园和向左走(三角形性质和点集排序)
- mysql报表服务器配置_Power Bi报表服务器安装及数据库配置方法
- Struts2 框架项目新建教程(strut 2.5.20)(基于IDEA)
- ubuntu查看MAC地址
- 树状数组再进阶(区间修改+区间查询)
- 用Random类做猜数字游戏