REL05-BP03 控制与限制重试调用
使用指数回退来重试请求,每次重试之间的间隔会逐渐延长。在两次重试之间引入抖动来随机调整重试间隔。限制最大重试次数。
期望结果:分布式软件系统中的常见组件包括服务器、负载均衡器、数据库和 DNS 服务器。在正常运行期间,这些组件对请求的响应可能是临时错误或者受限制错误,也能是无论如何重试都会持续存在的错误。当客户端向服务发出请求时,请求会消耗资源,包括内存、线程、连接、端口或任何其他有限的资源。控制和限制重试策略用于释放资源并最大限度地减少资源消耗,这样就可以避免承受压力的系统组件不堪重负。
当客户端请求超时或收到错误响应时,客户端应决定是否重试。如果进行重试,则会按照最大重试次数值,采用指数回退和抖动方法进行重试。因此,后端服务和进程可以缓解负载并缩短自我修复时间,从而加快恢复速度并成功处理服务请求。
常见反模式:
-
实施重试,但没有添加指数回退、抖动和最大重试次数值。指数回退和抖动有助于避免因无意间按照相同间隔协调进行重试,从而导致的人为流量峰值。
-
实施重试但没有测试重试的效果,或者假设 SDK 中已经内置了重试而不测试重试场景。
-
无法理解依赖项发布的错误代码,导致重试所有错误,包括那些有明确原因的错误,这些错误指出缺乏权限、配置错误或其他预计需要手动干预才能解决的情况。
-
没有解决可观测性实践,包括监控反复出现的服务故障并发出警报,以便了解和解决潜在问题。
-
在内置或第三方重试功能便已足够时,开发自定义重试机制。
-
在应用程序堆栈的多层进行重试,而重试方法导致重试尝试复杂化,进一步加剧了重试风暴中的资源消耗。一定要了解这些错误对您的应用程序以及所依赖的依赖项有何影响,然后仅在一个级别实施重试。
-
重试非幂等的服务调用,导致意外的副作用,例如重复的结果。
建立此最佳实践的好处:重试有助于客户端在请求失败时获得预期的结果,但也会消耗更多的服务器时间来获取所需的成功响应。当故障比率很低或者是临时性故障时,重试效果很好。当故障是由资源过载导致时,重试会导致情况进一步恶化。通过在客户端重试中添加指数回退和抖动,服务器可以从因资源过载导致的故障中恢复。抖动可避免请求同时出现造成峰值,指数回退可以减少因在正常请求负载中增添重试而导致的负载上升。最后,务必要配置最大重试次数或用时,避免产生导致亚稳态故障的积压。
在未建立这种最佳实践的情况下暴露的风险等级:高
实施指导
控制与限制重试调用。在逐渐延长的间隔以后使用指数回退进行重试。引入抖动来随机调整重试间隔,并限制重试的最大次数。
默认情况下,一些 AWS SDK 实施重试和指数回退。在适用于工作负载的情况下,使用这些内置 AWS 实施。在调用幂等性服务时,以及重试可以提高客户端可用性时,在工作负载中实施类似的逻辑。根据应用场景确定超时以及何时停止重试。为重试应用场景构建和演练测试场景。
实施步骤
资源
相关最佳实践:
相关文档:
相关示例:
相关视频:
相关工具: