一文让你彻底弄清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 实例。
    file

  • 总结如果系统出现故障,则切换到备用系统

fail-back - 故障恢复

故障恢复是指将之前处于故障状态的系统恢复到原始工作状态,主系统可用后,自动从备用系统恢复到主系统。

private static boolean needSwitchToMaster = Boolean.FALSE;

public void failBack() {
    while (true) {
        if (masterSystemAvailable()) {
            //fail-back
            needSwitchToMaster = Boolean.TRUE;
            break;
        }
    }
}
  • Example : MySQL的双Master模式,节点 A 和 B 之间总是互为主备关系,如果 A 实例出现故障,则切换至从 B 实例。
    file
  • 总结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容错机制,防止请求堆积而消耗大量的线程、内存、网络等资源,进而影响到整个系统的稳定。
    file
  • 总结将不可用服务进行隔离一段时间,避免影响整个系统的稳定性

总结

file

参考

  • https://blog.csdn.net/u011305680/article/details/79730646
  • http://icyfenix.cn/distribution/traffic-management/failure.html

本文仅介绍了几种常见的容错机制,欢迎老铁们进行讨论和补充~

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于软件failsafe,常见做法包括使用备份系统和自动化错误检测和恢复机制来保证软件能够自动切换到备份系统以及在出现错误时自动检测和恢复。此外,还可以使用容错编程技术,如异常处理和输入验证,以减少程序运行时出现错误的可能性。 ### 回答2: 软件failsafe指的是在出现故障或异常情况时,软件能够采取一些预定的措施,确保系统的稳定性和安全性。下面是几种保障软件failsafe的方法: 1. 异常处理机制:在软件设计中,应该充分考虑各种可能的异常情况,并定义针对这些异常情况的处理机制。例如,使用try-catch语句块来捕获并处理异常,避免程序崩溃。 2. 输入验证和过滤:对用户输入的数据进行全面的验证和过滤,确保输入数据的合法性和安全性。避免恶意输入或非法操作对系统造成损害。 3. 日志记录和追踪:建立完善的日志系统,记录软件运行过程中的各类事件和异常情况。通过查看日志,可以快速定位问题,并及时采取措施进行修复。 4. 备份与恢复:定期对软件和相关数据进行备份,确保在出现严重故障时能够恢复系统。同时,建立有效的恢复机制,能够在系统崩溃后迅速重启,并尽可能地保留用户数据。 5. 代码审查和测试:进行严格的代码审查和测试,确保软件的质量和稳定性。通过测试能够发现潜在的问题和漏洞,提前修复,从而避免软件failsafe。 6. 线程管理和资源控制:合理管理软件中的线程和资源,避免因为资源竞争而导致死锁或卡死的情况发生。通过良好的资源控制,保证软件的可靠性和性能。 总之,软件failsafe的实现需要综合考虑多个方面的因素,例如异常处理、输入验证、日志记录、备份与恢复、代码审查和测试,以及线程管理和资源控制。通过采取这些措施,可以提高软件的稳定性和可靠性,保障系统的正常运行。 ### 回答3: 软件failsafe是指软件在面对错误或异常情况时能够保持稳定运行或者能够恢复正常操作的能力。以下是几个保证软件failsafe的方法: 1. 异常处理:在软件开发过程中,应该充分考虑可能出现的各种异常情况,并进行相应的处理。通过合理的异常处理机制,软件能够及时捕获和处理错误,防止错误进一步传播和影响软件的正常运行。 2. 输入验证:软件应该对用户输入进行严格的验证,避免恶意输入或者非法操作导致的错误。合理的输入验证可以帮助软件避免因为不合法输入而导致崩溃或者漏洞。 3. 事务处理:对于需要进行持久化操作的软件,应该采用事务处理机制。事务处理可以保证在出现错误时,能够回滚到之前的稳定状态,避免数据的损坏和丢失。 4. 完备的测试:软件开发过程中需要进行充分的测试,包括单元测试、集成测试和系统测试等。通过不同层级的测试,可以发现并解决潜在的问题,提高软件的稳定性和可靠性。 5. 调试日志:软件应该具备详细的调试日志功能,记录软件的运行过程和状态。当软件出现错误时,通过日志可以追踪错误发生的原因和过程,帮助开发人员快速定位和修复问题。 总之,软件failsafe是一项重要的工作,需要在软件设计和开发的各个环节中予以考虑和实践。通过合理的异常处理、输入验证、事务处理、完备的测试和调试日志等方法,能够保证软件在面对错误和异常情况时的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值