失败容错策略 failover、failfast、failback、failsafe

2,954 阅读5分钟

失败容错策略 failover、failfast、failback、failsafe

  • failover

    Fail-Over的含义为“失效转移”,是一种备份操作模式,当主要组件异常时,其功能转移到备份组件。其要点在于有主有备,且主故障时备可启用,并设置为主。如Mysql的双Master模式,当正在使用的Master出现故障时,可以拿备Master做主使用。

    Failover可以自动对失败进行重试,对调用者屏蔽了失败的细节,但是Failover策略也会带来一些副作用:

    • 重试会额外增加一下开销,例如增加资源的使用,在高负载系统下,额外的重试可能让系统雪上加霜。
    • 重试会增加调用的响应时间。
    • 某些情况下,重试甚至会造成资源的浪费。考虑一个调用场景,A->B->C,如果A处设置了超时100ms,再B->C的第一次调用完成时已经超过了100ms,但很不幸B->C失败,这时候会进行重试,但其实这时候重试已经没有意义,因此在A看来这次调用已经超时,A可能已经开始执行其他逻辑。
  • failfast

    快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作。尽可能的发现系统中的错误,使系统能够按照事先设定好的错误的流程执行,对应的方式是“fault-tolerant(错误容忍)”。以JAVA集合(Collection)的快速失败为例,当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

    • 例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常(发现错误执行设定好的错误的流程),产生fail-fast事件。

    • 例如新增记录。新增记录是非幂等性的写操作,因为每次新增都会使数据库产生一条新的记录;而删除操作是幂等性的操作,因为只要删除一次后,以后每次删除的结果都不会改变数据库的内容。

    • 例如调用某个服务,其中包含一个数据库的写操作,如果写操作完成,但是在发送结果给调用方的过程中出错了,那么在调用发看来这次调用失败了,但其实数据写入已经完成。这种情况下,重试可能并不是一个好策略,这时候就需要使用到Failfast策略,调用失败立即报错。让调用方来决定下一步的操作并保证业务的幂等性。

  • failback

    失败自动恢复,后台记录失败请求,定时重发。在cluster网络系统(有两台或多台服务器互联的网络)中,由于要某台服务器进行维修,需要网络资源和服务暂时重定向到备用系统。在此之后将网络资源和服务器恢复为由原始主机提供的过程,称为自动恢复。

    Failback通常和Failover两个概念联系在一起。在高可用系统中,当主机发生故障,通过Failover进行主备切换后,待故障恢复后,系统应该具备自动恢复原始配置的能力。

  • failsafe

    Fail-Safe的含义为“失效安全”,即使在故障的情况下也不会造成伤害或者尽量减少伤害。维基百科上一个形象的例子是红绿灯的“冲突监测模块”当监测到错误或者冲突的信号时会将十字路口的红绿灯变为闪烁错误模式,而不是全部显示为绿灯。

    失败安全策略的核心是即使失败了也不会影响整个调用流程。通常情况下用于旁路系统或流程中,它的失败不影响核心业务的正确性。在实现上,当出现调用失败时,会忽略此错误,并记录一条日志,同时返回一个空结果,在上游看来调用是成功的。

    应用场景,可以用于写入审计日志等操作。

各种策略对比(针对Dubbo)

  • 下表对各种策略做一个简单对比,
策略名称优点缺点主要应用场景
Failover对调用者屏蔽调用失败的信息增加RT,额外资源开销,资源浪费对调用rt不敏感的场景
Failfast业务快速感知失败状态进行自主决策产生较多报错的信息非幂等性操作,需要快速感知失败的场景
Failsafe即使失败了也不会影响核心流程对于失败的信息不敏感,需要额外的监控旁路系统,失败不影响核心流程正确性的场景
Failback失败自动异步重试重试任务可能堆积对于实时性要求不高,且不需要返回值的一些异步操作
Forking并行发起多个调用,降低失败概率消耗额外的机器资源,需要确保操作幂等性资源充足,且对于失败的容忍度较低,实时性要求高的场景
Broadcast支持对所有的服务提供者进行操作资源消耗很大通知所有提供者更新缓存或日志等本地资源信息

  • 引用参考
  1. Dubbo Design For failure
  2. failover、failfast、failback、failsafe 容错机制