17

这是我见过的一些示例代码。

int expBackoff = (int) Math.pow(2, retryCount);
int maxJitter = (int) Math.ceil(expBackoff*0.2);
int finalBackoff = expBackoff + random.nextInt(maxJitter);

我想知道在这里使用随机抖动有什么好处?

4

3 回答 3

25

假设您有多个发送冲突消息的客户端。他们都决定退缩。如果他们使用相同的确定性算法来决定等待多长时间,他们将同时重试——导致另一次冲突。添加一个随机因子将重试分开。

于 2017-10-25T18:10:18.100 回答
7

它可以平滑所请求资源的流量。

如果您的请求在特定时间失败,则很有可能其他请求几乎在同一时间失败。如果所有这些请求都遵循相同的确定性回退策略(例如,在 1、2、4、8、16... 秒后重试),那么第一次失败的每个人都会在几乎完全相同的时间重试,并且很有可能同时请求的数量会超过服务可以处理的数量,从而导致更多的失败。即使在这些重试峰值之外的服务上的整体负载水平很小,这个同时请求的同一集群也会重复出现,并且可能会重复失败。

通过引入抖动,最初的失败请求组可能会聚集在一个非常小的窗口中,比如 100 毫秒,但是随着每个重试周期,请求集群会扩展到一个越来越大的时间窗口,从而减小给定峰值的大小时间。当服务分布在足够大的窗口上时,该服务很可能能够处理请求。

于 2017-10-25T18:25:49.193 回答
3

随机化避免了多次调用同时发生的重试。

有关指数退避和抖动的更多信息,请访问:https ://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/

于 2019-05-23T13:25:30.277 回答