分布式系统可靠性模式实践
1. 指数退避重试请求
在分布式系统中,故障不可避免。我们应设计具备自我修复能力的系统,而不是试图完全防止故障。当客户端发起重试时,拥有一个好的策略至关重要。服务可能会暂时不可用,或者出现需要值班工程师手动响应的问题。在这些情况下,客户端应能够对请求进行排队并重试,以提高成功的机会。
无休止地重试请求并非有效策略。想象一个服务的失败率高于正常水平,甚至所有请求都失败。如果客户端不断地将重试请求入队而不放弃,就会出现“惊群效应”,即客户端无限制地持续重试请求。随着故障的持续,更多客户端会遇到失败,导致更多重试。最终会形成类似于拒绝服务攻击时的流量模式,服务会因过载而出现级联故障,合法流量也会被丢弃,应用程序将无法使用,且故障服务更难隔离和修复。
为防止“惊群效应”,可采用指数退避算法,该算法会指数级增加重试之间的等待时间,并在一定次数的失败后放弃,这种方法称为上限指数退避。在重试之间添加指数级增加的休眠函数,可使客户端减慢重试尝试,分散负载。但客户端的重试仍会集中,导致服务在某些时间段内受到大量并发请求的冲击。为解决此问题,可在休眠函数中添加随机值或抖动,以分散重试时间。
我们的重试策略有以下三个要求:
- 重试必须使用指数退避进行间隔。
- 重试必须通过添加抖动进行随机化。
- 重试必须在特定时间后终止。
大多数 HTTP 库都支持满足这些要求的重试策略,下面我们以 Google 编写的 Java HTTP 客户端库为例进行演示。
操作步骤
- 创建 Ruby 示例服务 :该服务的简单任务是返回
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



