知识卡片

只在拒绝的那一层重试,避免重试风暴

普通读书笔记卡 · 1619

内容

深层调用栈中,请求只应该在被拒绝的那一层的直接上层重试,而不是每一层收到下游过载错误都自行 重试。例如数据库前端拒绝的请求应仅在其直接上层(后端任务B)重试;后端任务B确认下游多次重试 仍过载后(如已重试满3次),应向自己的上游返回”过载,无须重试”信号,而非任由上层再重试一遍 已证明无效的路径。若多层各自重试,会造成批量重试爆炸——具体的放大规模和护栏措施见 [[多层重试的指数放大效应]]。

参考来源

- 位置:《SRE:Google运维解密》第21章《应对过载》"决定何时重试"一节(源文件:_epub-src/OEBPS/Text/0009_0012.xhtml) - 结论依据:原文明确"请求只应该在被拒绝的层面上面的那一层进行重试……当我们决定某个请求无法被处理,同时不应该被重试时,返回一个'过载;无须重试'错误,以避免触发一个大型的重试爆炸",并以数据库前端与后端任务B的例子说明重试应限制在直接上层。 - 原始内容:这里的关键点是,数据库前端拒绝的请求应该仅仅在后端任务B处重试——在它的直接上层处。如果多层都要进行重试,会造成批量重试爆炸情况。