知识卡片
重试要有指数退避加随机抖动
内容
服务器故障期间,如果所有客户端都在收到错误后立即重试,且间隔完全相同,那么故障恢复的那一刻,所有客户端会同一瞬间再次涌入,造成第二波足以让服务再次崩溃的流量峰值。解决办法是重试间隔随失败次数指数增长,同时给每个客户端的等待时间加入随机抖动,避免同步重试。这个机制对无法控制客户端行为的服务(如权威DNS)尤其重要——唯一能做的是尽可能多地成功响应请求,让重试逻辑自然解除。
参考来源
- 位置:《Google系统架构解密:构建安全可靠的系统》第10章《缓解拒绝服务攻击》10.4.2节客户端重试行为(源文件:`../OREILY动物书合辑 图灵新版/_epub-src/text/part0014_split_088.html`)
- 结论依据:原文说明客户端重试需要指数递减逻辑限制请求数量,但"服务崩溃时会同时影响所有客户端反复重试,从而产生流量激增",因此需要加入抖动让每个客户端随机等待,并说明权威DNS这类无法控制客户端行为的服务只能靠尽可能多地成功响应来解除重试逻辑。
- 原始内容:当服务器异常时,客户端可以重试,但必须加入指数递减的逻辑……为了避免同时重试,每个客户端都应该随机等待一段时间。我们称这种方式为抖动(jitter)……这种情况下,最佳选择很简单:尽可能应答查询请求,同时通过在上游限流来保持服务的正常运行。