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)
我想知道在这里使用随机抖动有什么好处?
假设您有多个发送冲突消息的客户端.他们都决定退缩.如果他们使用相同的确定性算法来决定等待多长时间,他们将同时重试 - 导致另一次碰撞.添加随机因子会分离重试次数.
小智 7
它可以平滑正在请求的资源上的流量。
如果您的请求在特定时间失败,则其他请求很有可能几乎在同一时间失败。如果所有这些请求都遵循相同的确定性退避策略(例如,在 1、2、4、8、16 秒后重试),那么第一次失败的每个人都将在几乎完全相同的时间重试,并且很有可能同时请求的数量超过服务可以处理的数量,从而导致更多的失败。即使在这些重试峰值之外的服务总体负载水平很小,这个相同的并发请求集群可能会重复出现,并且可能会重复失败。
通过引入抖动,最初的失败请求组可能会聚集在一个非常小的窗口中,比如 100 毫秒,但是随着每个重试周期,请求集群扩展到越来越大的时间窗口中,从而减少给定峰值的大小时间。当分布在足够大的窗口上时,服务很可能能够处理请求。
随机化避免了多个调用同时重试。
有关指数退避和抖动的更多信息,请访问: https: //aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/