以下是我见过的一些示例代码。
int expBackoff = (int) Math.pow(2, retryCount);
int maxJitter = (int) Math.ceil(expBackoff*0.2);
int finalBackoff = expBackoff + random.nextInt(maxJitter);
我想知道在这里使用随机抖动有什么好处?
答案 0 :(得分:7)
假设您有多个发送冲突消息的客户端。他们都决定退缩。如果他们使用相同的确定性算法来决定等待多长时间,他们将同时重试 - 导致另一次碰撞。添加随机因子会分离重试次数。
答案 1 :(得分:2)
它可以平滑所请求资源的流量。
如果您的请求在特定时间失败,则其他请求很可能几乎在同一时间失败。如果所有这些请求都遵循相同的确定性退避策略(例如,在1,2,4,8,16 ......之后重试),那么第一次失败的每个人将在几乎完全相同的时间重试,并且很可能会有比服务可以处理更多的同时请求,导致更多的失败。同一个并发请求集群可能会重复出现,并且可能会重复失败,即使这些重试峰值之外的服务的总体负载水平很小。
通过引入抖动,初始的失败请求组可以聚集在一个非常小的窗口中,比如说100ms,但是对于每个重试周期,请求簇会扩展到越来越大的时间窗口,从而减小了尖峰的大小在给定的时间。当服务分布在足够大的窗口上时,该服务很可能能够处理这些请求。
答案 2 :(得分:0)
随机化避免重试多次呼叫同时发生。
有关指数补偿和抖动的更多信息,请参见:https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/