背景

最近参与了部门的稳定性建设,时常会看到一些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相关推荐

  1. fail-fast 和 fail-safe 快速学习

    文章目录 fail-fast(快速失败) 概念 原理 应用场景 fail-safe(安全失败) 概念 原理 应用场景 二者区别 代码示例 调试fail-fast 调试fail-safe 首选说一下这两 ...

  2. Dubbo2.7文档详解

    本篇博文参考dubbo官方文档 本编博文参考javaguide之rpc 文章目录 一.RPC 1.1 什么是 RPC? 1.2 为什么要用 RPC? 1.3 RPC 能帮助我们做什么呢? 1.4 RP ...

  3. RPC框架:从原理到选型,一文带你搞懂RPC

    大家好,我是华仔,RPC系列的文章是我去年写的,当时写的比较散,现在重新进行整理.对于想学习RPC框架的同学,通过这篇文章,让你知其然并知其所以然,便于以后技术选型,下面是文章内容目录: RPC 什么 ...

  4. 源码解读Dubbo分层设计思想

    I作者:vivo互联网服务器团队-Wang Genfu 一.Dubbo分层整体设计概述 我们先从下图开始简单介绍Dubbo分层设计概念: (引用自Duboo开发指南-框架设计文档) 如图描述Dubbo ...

  5. dubbo扫描第三方包_今天来浅谈一下dubbo

    一.什么是Dubbo接口 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  6. dubbo ,dubbo-provider、dubbo-consumer 配置参数说明

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. dubbo:consumer 服务消费者缺省值配置.配置类: com.alibaba.dubbo.c ...

  7. dubbo 相关面试题 有用

    调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...

  8. dubbo配置参考手册

    配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/&g ...

  9. dubbo 配置及分析

    一.配置 <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifact ...

  10. 如何使用JMeter 对Dubbo接口进行测试

    1.Dubbo介绍 (1)Dubbo说明 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说:Dubbo一个高性能的,基于 Java  ...

最新文章

  1. sdut 2805(最小生成树)
  2. JQuery学习系列(九)AJAX
  3. 最新android 手机型号,各大安卓手机厂商Android 10系统更新汇总,你的机型支持吗?...
  4. dos进入/退出某文件夹
  5. html中免费的四级联动,利用JS实现省市区街道四级联动插件
  6. P3085,jzoj3234-[USACO13OPEN]阴和阳【点分治】
  7. centos7 关闭selinux_Devops之LDAP部署安装(centos7+openLDAP+PhpLDAPAdmin)
  8. (二叉树DFS)天平UVa 839
  9. android可以定义函数吗,Android自定义view 你所需要知道的基本函数总结
  10. Myeclipse打断点太多,不知道怎么一次性全删除
  11. 达“超人”水平?强化学习得这么用!
  12. python---之[::-1]
  13. Andorid中的dex文件使用dex2jar工具反编译
  14. vrep系列教程(一)——熟悉vrep
  15. 三角形花园和向左走(三角形性质和点集排序)
  16. mysql报表服务器配置_Power Bi报表服务器安装及数据库配置方法
  17. Struts2 框架项目新建教程(strut 2.5.20)(基于IDEA)
  18. ubuntu查看MAC地址
  19. 树状数组再进阶(区间修改+区间查询)
  20. 用Random类做猜数字游戏

热门文章

  1. 多粒度网络(MGN)的结构设计与技术实现
  2. word如何去掉标题前面的黑点
  3. 如何寻找竞争情报发挥企业优势
  4. Matlab 线性拟合 非线性拟合
  5. 云服务器出现502错误的原因与解决方案
  6. SPSS作业-一元线性回归
  7. python汇率换算注释_【菜鸟学Python】案例一:汇率换算
  8. 毕业设计(毕设)目标和要求 (以计算机软件毕业设计为例)
  9. 【python】模拟斗牛纸牌游戏「牛牛」
  10. 无线路由桥接关掉服务器要怎么办,路由器设置无线桥接后不能登录副路由器怎么办?...