指数退避算法是适用于网络应用的标准错误处理策略,使用这种策略时,客户端会定期重试失败的请求,并不断增加各次请求之间的延迟时间。客户端应对发送到 Memorystore for Redis 且返回 HTTP 5xx
和 429
响应代码错误的所有请求使用指数退避算法。
如果您要开展以下任务,请务必了解指数退避算法的工作原理:
构建直接使用 Memorystore for Redis REST API 的客户端应用。
通过客户端库访问 Redstore Memorystore for Redis。请注意,某些客户端库(例如 Node.js 版 Memorystore for Redis 客户端库)内置了指数退避算法。
如果您使用的是 Google Cloud 控制台,控制台会代表您向 Memorystore for Redis 发送请求,并处理任何必要的退避时间。
示例算法
指数退避算法以指数方式重试请求(不断增加各次重试之间的等待时间,直到达到最大退避时间)。示例如下:
向 Memorystore for Redis 发出请求。
如果请求失败,请等待 1 +
random_number_milliseconds
秒后再重试请求。如果请求失败,请等待 2 +
random_number_milliseconds
秒后再重试请求。如果请求失败,请等待 4 +
random_number_milliseconds
秒后再重试请求。依此类推,等待时间上限为
maximum_backoff
。等待时间达到上限后,您可以继续等待并重试,直到达到重试次数上限(但接下来的重试操作不会增加各次重试之间的等待时间)。
其中:
等待时间为 min(((2^
n
)+random_number_milliseconds
),maximum_backoff
),其中,n
会在每次迭代(请求)后增加 1。random_number_milliseconds
是小于或等于 1000 的毫秒数(随机值)。这有助于避免出现以下情况:许多客户端在某些情况下全部同步进行处理并同时执行重试操作,导致同步发送每一波请求。每次重试请求后,系统都应重新计算random_number_milliseconds
值。maximum_backoff
通常为 32 或 64 秒。哪个值更为适当,这取决于用例。
达到 maximum_backoff
时间后,您可以继续重试。
此后执行的重试不需要继续增加退避时间。例如,如果客户端使用的 maximum_backoff
时间为 64 秒,则在达到此值后,客户端可以每 64 秒重试一次。在某个时刻,应阻止客户端无限重试。
客户端使用的最长退避时间和最大重试次数取决于使用场景和网络条件。例如,与桌面客户端相比,同一应用的移动客户端可能需要重试更多的次数和设置更长的时间间隔。
如果在超出重试次数上限后重试请求失败,请使用获取支持下列出的其中一种方法报告或记录错误。