为什么随机抖动应用于退避策略?

问题描述 投票:3回答:2

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

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

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

algorithm random exponential-backoff
2个回答
8
投票

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


2
投票

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.