Algorithm 为什么随机抖动应用于退避策略?
下面是我看到的一些示例代码Algorithm 为什么随机抖动应用于退避策略?,algorithm,random,exponential-backoff,Algorithm,Random,Exponential Backoff,下面是我看到的一些示例代码 int expBackoff = (int) Math.pow(2, retryCount); int maxJitter = (int) Math.ceil(expBackoff*0.2); int finalBackoff = expBackoff + random.nextInt(maxJitter); 我想知道在这里使用随机抖动有什么好处?假设您有多个客户端发送冲突的消息。他们都决定放弃。如果它们使用相同的确定性算法来决定等待多长时间,它们将同时重试——导致
int expBackoff = (int) Math.pow(2, retryCount);
int maxJitter = (int) Math.ceil(expBackoff*0.2);
int finalBackoff = expBackoff + random.nextInt(maxJitter);
我想知道在这里使用随机抖动有什么好处?假设您有多个客户端发送冲突的消息。他们都决定放弃。如果它们使用相同的确定性算法来决定等待多长时间,它们将同时重试——导致另一次冲突。添加一个随机因子会分隔重试次数。它会平滑所请求资源上的流量 如果您的请求在某个特定时间失败,那么其他请求很有可能在几乎完全相同的时间失败。如果所有这些请求都遵循相同的确定性退避策略(例如,在1、2、4、8、16…秒后重试),那么第一次失败的每个人都将在几乎完全相同的时间重试,并且很有可能同时发生的请求比服务能够处理的要多,从而导致更多的失败。即使重试峰值之外的服务总体负载水平很小,这组相同的并发请求也可能重复出现,并可能重复失败
通过引入抖动,失败请求的初始组可能会聚集在一个非常小的窗口中,比如100ms,但是随着每个重试周期的进行,请求的集群会扩展到一个越来越大的时间窗口中,从而减少给定时间的峰值大小。当请求分布在一个足够大的窗口上时,该服务可能能够处理请求。随机化避免了同时发生多个调用的重试
关于指数退避和抖动的更多信息可以在这里找到:事实上,或者我喜欢称之为“Alphonse&Gaston”问题。我知道这是雷鸣/树桩群问题()这篇AWS文章通过简单的分析对理解几种退避算法非常有用。