REL05-BP03 控制与限制重试调用 - AWS Well-Architected Framework

REL05-BP03 控制与限制重试调用

在逐渐延长的间隔以后使用指数回退进行重试。引入抖动使此类重试间隔随机化,并限制重试的最大次数。

分布式软件系统中的常见组件包括服务器、负载均衡器、数据库和 DNS 服务器。在操作中,受故障影响,任何此类组件都可能开始生成错误。处理错误的默认方式为,在客户端实施重试。此方法可提高应用程序的可靠性和可用性。不过,如果规模较大,而且客户端在错误发生时立即重试失败的操作,网络中的新请求和重试请求可能会快速导致饱和,并争用网络带宽。这可能导致 重试风暴, 从而降低服务的可用性。此模式可能会继续,直到发生全系统故障。

为避免出现此情况,应使用回退算法,如常用的 指数回退 。指数回退算法会逐渐降低执行重试的速率,从而避免网络阻塞。

很多开发工具包和软件库(包括 AWS 的开发工具包和软件库)都实施此类算法的一种版本。但是, 别心存侥幸地认为已采用回退算法,始终要进行测试和验证。

仅依靠回退还不够,因为在分布式系统中,所有客户端都可能同步回退,形成重试调用集群。Marc Brooker 在他的博文 指数回退和抖动中解释了如何修改指数回退中的 wait() 函数以防止形成重试调用集群。他给出的解决办法  在 wait() 函数中增加抖动。要避免过长时间的重试,实施应为回退设置一个最大值限制。

最后,务必要配置 最大重试次数 或已用时间,在此以后,重试将失败。AWS 开发工具包将默认实施此操作,而且也可以对它进行配置。针对堆栈中较低的服务,最大重试限制为 0 或 1 可以限制风险,而且在将重试委派给堆栈较高的服务时依然有效。

未建立这种最佳实践的情况下暴露的风险等级:

实施指导

  • 控制与限制重试调用。在逐渐延长的间隔以后使用指数回退进行重试。引入抖动使此类重试间隔随机化,并限制重试的最大次数。

    • AWS 中的错误重试和指数回退

      • 默认情况下,Amazon SDK 实施重试和指数回退。在调用自己的依赖服务时,您需要在依赖关系层中执行类似的逻辑。根据您的使用案例确定超时以及何时停止重试。

资源

相关文档:

相关视频: