当代码在等待某些延迟时间不确定的条件时,许多人选择使用指数退避,即等待N秒,检查条件是否满足;如果不满足,则等待2N秒,再次检查条件等。相对于在恒定/线性递增的时间段内进行检查,这种方法的好处是什么?
指数退避在同时尝试做某事会相互干扰以至于没有成功的情况下非常有用。在这种情况下,让设备在一个太小的时间窗口内随机尝试操作将导致大多数尝试失败并需要重试。只有当时间窗口变得足够大时,才有任何显著成功的可能性。
如果人们预先知道有16个设备想要通信,就可以选择最适合该负载水平的时间窗口大小。但实际上,竞争设备的数量通常是未知的。指数退避的优点是,在每次重试中时间窗口的大小加倍,无论竞争实体的数量如何:
绝大多数操作成功的窗口大小通常在大多数操作成功的最小窗口大小的两倍范围内,
在那个时间窗口大小失败的大多数操作将在下一次尝试中成功(因为较早的大多数操作将已经成功,这将使不到一半的操作竞争一个两倍大的时间窗口),并且
如果不是每次加倍,而是通过增加固定数量来扩大时间窗口,则重试操作直到时间窗口达到可用大小所花费的时间将与所需窗口大小的平方成比例。虽然最终的时间窗口大小可能会比使用指数退避小,但所有尝试的总成本会大得多。