常用的下游容错手段及案例

一个高可用的系统需要做好自身、防御上游、容错下游。防御上游的手段常见的有严格准入和限流。容错下游的常用手段有4个fail和合理设置超时重试。还有一种叫forking的容错手段,是并行的调用下游,一个成功就返回成功。如今都在降本增效,这个高成本方法不太实用,所以这里就不过多介绍了。

failover:失效转移

失效转移是一种备份操作模式,当主要组件异常时,其功能转移到备份组件。

举个例子,一个网关系统,要将请求路由到下游。如果中间是专线传输,一般不只一条专线。如果一条专线发生故障,重试时算法中选择路由时需要排除这条专线,选择一条没被标记故障的专线,这就是典型的failover。

failback:失效自动恢复

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

举个例子,刚才说的网关系统。另外有一个系统是故障处理系统。它会定时检查各条专线的情况,如果专线故障,它会将专线权重调成0。如果专线恢复,它会慢慢恢复,慢慢升权直到恢复到原来的权重,这个过程就是failback。

failfast:快速失败

快速失败是尽可能的发现系统中的错误,使系统能够按照事先设定好的错误的流程执行。

举个例子:如果下游是外部机构,比如银行。银行发通知说停服维护。那究竟停服的时候,请求发过去是成功、失败还是超时都是未知数。这时候可以做快速失败。在期间有请求银行,我们并不直接发给银行,而是直接返回:银行正在维护。避免不可知结果产生。

failsafe:失效安全

失效安全是即使在故障的情况下也不会造成伤害或者尽量减少伤害。

举个例子:交易处理中,有给用户加减积分的操作。加减积分实时性要求没有这么高。这种操作就直接将数据扔到kafka消息队列中,积分系统来自己订阅。如果kafka发生故障,就等故障恢复后再处理,实时链路不受影响。

合理的超时和重试

超时重试是解决分布式系统的三态问题。分布式系统的三态是成功、失败和超时。对于超时,如果重试成功,最终是成功的。如果重试之后都失败,那就失败的。这样三态问题可以转换为两态。

常用的下游容错手段及案例_第1张图片

超时时间可以初始设置TP99的5倍,配合压测,看在极端情况下线程池会不会被打满。不会打满则可保留此设置,否则就需要降低超时时间。降低超时时间会造成失败率升高,因为一些慢请求最终有可能是成功的。重试可以减少失败率的发生,但不是所有的请求都能重试,需要下游是幂等的。一般查询请求都是幂等的。对于写入请求,有些不可以重试。httpclient的重试策略中IOException可以重试,像读超时 Read

timeout、套接字异常 Unexpected end of file from server、连接被重置都可能会引起重复提交。

重试除了重试次数也有重试策略,比如线性退让、指数级退让、二进制退让和随机退让。比如三次握手过程中,当全连接队列已满时,则根据 tcp_abort_on_overflow 的值来执行相应动作。

tcp_abort_on_overflow = 0 处理:

则服务器建立该连接的定时器,这个定时器是一个服务器的规则是从新发送syn+ack的时间间隔成倍的增加,比如从新了第二次握手,进行了5次,这五次的时间分别是 1s, 2s,4s,8s,16s,这种倍数规则叫“二进制指数退让”(binary exponential backoff)。

你可能感兴趣的:(常用的下游容错手段及案例)