REL05-BP03 控制与限制重试调用
在逐渐延长的间隔以后使用指数回退进行重试。引入抖动使此类重试间隔随机化,并限制重试的最大次数。
分布式软件系统中的常见组件包括服务器、负载均衡器、数据库和 DNS 服务器。在操作中,受故障影响,任何此类组件都可能开始生成错误。处理错误的默认方式为,在客户端实施重试。此方法可提高应用程序的可靠性和可用性。不过,如果规模较大,而且客户端在错误发生时立即重试失败的操作,网络中的新请求和重试请求可能会快速导致饱和,并争用网络带宽。这可能导致 重试风暴, 从而降低服务的可用性。此模式可能会继续,直到发生全系统故障。
为避免出现此情况,应使用回退算法,如常用的 指数回退 。指数回退算法会逐渐降低执行重试的速率,从而避免网络阻塞。
很多开发工具包和软件库(包括 AWS 的开发工具包和软件库)都实施此类算法的一种版本。但是, 别心存侥幸地认为已采用回退算法,始终要进行测试和验证。
仅依靠回退还不够,因为在分布式系统中,所有客户端都可能同步回退,形成重试调用集群。Marc Brooker 在他的博文 指数回退和抖动
最后,务必要配置 最大重试次数 或已用时间,在此以后,重试将失败。AWS 开发工具包将默认实施此操作,而且也可以对它进行配置。针对堆栈中较低的服务,最大重试限制为 0 或 1 可以限制风险,而且在将重试委派给堆栈较高的服务时依然有效。
未建立这种最佳实践的情况下暴露的风险等级: 高
实施指导
控制与限制重试调用。在逐渐延长的间隔以后使用指数回退进行重试。引入抖动使此类重试间隔随机化,并限制重试的最大次数。
-
-
默认情况下,Amazon SDK 实施重试和指数回退。在调用自己的依赖服务时,您需要在依赖关系层中执行类似的逻辑。根据您的使用案例确定超时以及何时停止重试。
-
-
资源
相关文档:
相关视频: