由于分布式系统是由多个分布在不同网络节点的子系统或者称为子服务组成,在处理客 户端请求时,服务之间需要通过网络来进行相互调用,所以如果某个服务由于宕机或者其他 原因导致不可用,则服务调用方需要采取一定的容错机制来避免该不可用服务影响了当前服 务的请求处理。
即一个服务可能会通过 RPC 调用多个其他服务,如果其中某个服务不可用, 则需要保证另外的多个服务的处理结果,以及当前发起 RPC 服务调用的服务的处理结果都 可以正常返回给客户端,只是这个不可用服务的处理结果需要返回错误而已。
分布式系统可以根据自身业务特点来选定容错机制,对服务调用失败采取不同的处理方 式和产生不同的处理结果,具体的容错机制可以分为如下六种。
FailOver:失败自动切换
失败自动切换机制是指当调用该服务集群的某个节点失败时,自动切换到该服务集群的 另外一个节点并进行重试,其中切换机制类似于负载均衡机制,不过一般采用轮询方式。这 种容错机制通常适用于读操作,所以可以请求从该服务集群的多个节点的任意一个节点获取 数据。由于需要切换到服务集群的另外一个节点进行服务重试,所以整个请求处理流程的时 间延迟会加大。
FailFast:快速失败
快速失败机制是指当进行服务调用失败时,直接返回错误,而不会进行重试或者切换到 服务集群的另外一个节点进行调用,即要么成功,要么失败,只发起一次服务调用请求。
这种机制通常适用于非幂等的操作,因为服务调用失败的原因包括:服务节点机器宕机 导致服务不可用;服务可用,但是两个服务节点之间的网络出现延迟或者被调用的服务节点 繁忙,处理请求缓慢,导致返回结果超时。所以当服务调用失败时,可能确实没有进行操作, 也可能是进行了操作,但是返回响应结果超时或者丢失,而该操作又是非幂等的,故不能进 行重复操作,否则会导致数据不一致性。
FailSafe:失败安全
失败安全机制跟快速失败机制类似,都是只发起一次服务调用,要么成功,要么失败, 不会进行重试操作。不过与快速失败不同的是,失败安全机制在调用失败时会进行日志记录。 所以可以通过对日志进行监控和分析来及时了解服务调用情况,及早发现和处理服务调用失 败的情况,以及对于重要服务的调用可以通过日志的数据来进行补偿。
FailBack:失败自动恢复
失败自动恢复机制在服务调用失败时,跟失败安全机制类似也会进行服务调用的记录, 不过在记录的基础上,增加了自动定时重发的逻辑,适用于异步、幂等性的请求调用或者消 息系统中允许消息重复的场景。
Forking:并行调用多个服务节点
并行机制通常用于实时性要求较高的读操作的场景,其基本工作过程为并行调用服务集 群的所有节点,由于是读操作,故所有服务节点返回的数据都是相同的,所以只要有一个服 务节点返回调用成功则返回响应给客户端。
这种机制相对于 FailOver 失败自动切换机制,由于是对所有服务节点发起并行调用,而 不是在调用失败时才一个个轮询切换直到调用成功,所以延迟较小,实时性较高,不过机器 的系统资源开销较大,所以如果需要进行这种调用,则需要保证机器性能较高。
BroadCast:广播调用
广播调用与并行调用类似,也是需要对服务集群的每个节点都发起一次调用,不过不同 的是,广播调用通常用于服务集群的每个节点都维护了本地状态,然后需要对这种本地状态 进行写操作的场景,即需要同步写操作给服务集群的每个节点,从而保证每个节点的数据一 致性和可靠性。
总结
以上介绍了 6 种分布式系统中场景的容错机制,其中前 4 种容错机制是针对服务调用失 败的场景,而后面两种容错机制,即 Forking 和 Broadcast 更多的是对数据实时性和数据可 靠性方面的考虑和容错的实现。