一文让你彻底弄清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 ...
最新文章
- 如何在RHEV平台中新建ISO存储域
- react ui框架_顶级React组件库推荐
- 关于更新 Web 应用程序 URL 和 IIS 绑定
- 【数据竞赛】组合特征的构建技巧,如何快速构建百大组合特征池
- openlayer 3 在layer上添加feature
- 第一篇:SpringCloud 构建微服务系统之服务注册和发现(consul)
- leetcode1314. 矩阵区域和(动态规划)
- java学习(8):巩固练习
- 【深度学习】empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=None
- 训练日志 2018.10.18
- Kai - Golang实现的目标检测云服务
- IOS APP 上传到AppStore
- Android 使用手机向手表安装任意.apk
- MP3 Lame 转换 参数 设置(转)
- 360浏览器下页面样式显示异常的解决方法
- 全世界最全牛人博客,你可以学习到太多!
- Android 判断是否有外网连接
- 阿里高效沟通的秘密:向上沟通,跨部门沟通,PREP汇报...这5招绝了!
- ArcGis基础—shapefile矢量文件与lyr图层文件之间有何区别?
- vue实现数字翻页动画
热门文章
- 学习scratch3.0第2章
- 君正Ingenic X1000E_halley2 更改Logo
- 电路分析基础笔记(静态电路+动态电路)
- MAX96706开发板POC电路分析
- FPGA中的AXI总线知识点快速学习(适合新手)
- D触发器、D上升沿触发器、T触发器
- 私有云部署和本地化部署有什么区别?
- CCS 2021 | 自动化网络流量分析新方向
- html格式转换word清除格式,word文档如何清除格式(原来Word可以一键去除格式)...
- java order()_Java Comparator naturalOrder()用法及代码示例