跳转至

你知道有哪些退避策略吗?

典型回答

“退避”(Backoff)是在系统发生失败或异常后,延迟一段时间再重试的一种策略。它的核心思想是:不要立即、频繁地重试,而是给系统一点“喘息”的时间,以避免雪崩、资源耗尽或加剧故障。

这是一个在定时任务,重试任务等等系统中非常重要的东西。

假设你调用一个远程服务失败了,如果不做不退避,就是要立即重试,那么就意味着下游服务就要被一直怼,那么就会加剧他的问题,直至崩溃。

而如果使用一定的退避的话,就相当于给对方一点喘息时间、而且也能让自己减少一些无用的调用,提高整体系统的稳定性与容错能力。

在Spring中,其实定义了一些退避策略,给@Retryable注解用的。常见的退避策略有以下几种:

不退避(No Backoff)

不退避,就是直接重试,也算是一种策略。。。。。

固定退避(Fixed Backoff)

每次重试等待相同的时间。这种策略,用起来很简单,但是无法应对持续性故障(比如对方需要更长时间恢复)

指数退避(Exponential Backoff)

等待时间按指数增长:delay = base * (2^n),其中 n 是重试次数。例如:100ms → 200ms → 400ms → 800ms → ...

很多MQ的消息的消费失败的重投,用的就是这种策略,失败次数越多,下次投递的时间窗口就越长。

指数随机退避(ExponentialRandomBackOffPolicy)

指数随机退避。它在指数增长的基础上,增加了一个随机因子,可以避免在重试时多个客户端同时发起请求,造成“惊群效应”。