知识卡片

截止时间传递避免处理已被放弃的请求

普通读书笔记卡 · 1623

内容

调用链每一跳若各自独立设定超时,会出现服务器辛苦处理完请求时上游早已超时断开——这是无用功, 且在系统过载、最不该浪费资源时最常发生。正确做法是”截止时间传递”:在链路最上游设定绝对截止 时间,每一跳把剩余时间(而非固定新值)传给下一跳,处理前先检查是否还有剩余。案例:100s截止 时间下,5%请求会占满5000个线程,使前端仅能处理19.6%请求,造成80.4%错误率。

参考来源

- 位置:《SRE:Google运维解密》第22章《处理连锁故障》"截止时间传递""超过截止时间"两节(源文件:_epub-src/OEBPS/Text/0009_0013.xhtml) - 结论依据:原文说明"如果服务器B使用截止时间传递机制……服务器C应该立刻放弃处理该请求",并给出量化案例"使用100s的截止时间,5%的请求会消耗5000个线程(50QPS * 100 seconds)……前端也仅能够处理19.6%的请求……这会造成80.4%的错误率",支撑截止时间设置过长的危害。 - 原始内容:可使用截止时间传递机制,截止时间在整个服务栈的高层设置……使用100s的截止时间,5%的请求会消耗5000个线程(50QPS * 100 seconds),但是前端服务器并没有这么多可用线程……这会造成80.4%的错误率。