为什么将随机抖动应用于回退策略?
Why is random jitter applied to back-off strategies?
这是我看到的一些示例代码。
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 秒后重试),那么第一次失败的每个人几乎都会在同一时间重试,并且同时请求的数量很可能会超过服务可以处理的数量,从而导致更多的失败。即使在这些重试峰值之外服务的总体负载水平很小,同一集群的同时请求可能会反复出现,并且可能会反复失败。
通过引入抖动,最初的一组失败请求可能会聚集在一个非常小的 window 内,比如 100 毫秒,但是随着每个重试周期,这组请求会扩展到越来越长的时间 window,在给定时间减少尖峰的大小。当分布在足够大的 window.
上时,该服务很可能能够处理请求
随机化避免多个调用的重试同时发生。
有关指数退避和抖动的更多信息可在此处找到:https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
这是我看到的一些示例代码。
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 秒后重试),那么第一次失败的每个人几乎都会在同一时间重试,并且同时请求的数量很可能会超过服务可以处理的数量,从而导致更多的失败。即使在这些重试峰值之外服务的总体负载水平很小,同一集群的同时请求可能会反复出现,并且可能会反复失败。
通过引入抖动,最初的一组失败请求可能会聚集在一个非常小的 window 内,比如 100 毫秒,但是随着每个重试周期,这组请求会扩展到越来越长的时间 window,在给定时间减少尖峰的大小。当分布在足够大的 window.
上时,该服务很可能能够处理请求随机化避免多个调用的重试同时发生。
有关指数退避和抖动的更多信息可在此处找到:https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/