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

Wil*_*ire 5 random algorithm exponential-backoff

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

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

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

Dal*_*son 9

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

  • 确实或者我喜欢称之为“阿尔方斯和加斯顿”问题。https://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html (2认同)
  • 我知道这是雷鸣般的/绊倒羊群问题(https://en.wikipedia.org/wiki/Thundering_herd_problem) (2认同)

小智 7

它可以平滑正在请求的资源上的流量。

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

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


Max*_*ime 5

随机化避免了多个调用同时重试

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