Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么随机抖动应用于退避策略?_Algorithm_Random_Exponential Backoff - Fatal编程技术网

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文章通过简单的分析对理解几种退避算法非常有用。