上一题下一题

下游服务响应变慢后,上游超时重试导致请求量继续上升;你会如何设置超时、重试预算、隔离和熔断,并判断何时降级?

旗舰版
来源:bytedance中级工程师熔断降级服务隔离重试预算超时重试策略
草稿该题目为草稿状态,前台公开题库中不可见。
答案解析

我一般不会只靠“加重试”来解决下游变慢的问题,因为下游已经慢了,上游继续重试很容易把流量放大,最后把下游彻底打挂,甚至把上游线程池也拖死。

我的处理思路会分几层:

超时设置上,要有明确的端到端预算。

比如一个接口整体 SLA 是 300ms,那不能给某个下游调用也设置 300ms,更不能默认几秒钟。需要拆分链路预算,例如:

上游整体超时:300ms 调用下游 A:80ms 调用下游 B:100ms 预留序列化、业务逻辑、网络抖动时间

超时时间一般会参考下游的 TP95、TP99 延迟来定,而不是拍脑袋。对于核心接口,我更倾向设置相对保守的超时,比如略高于 TP99,但不能超过上游整体 SLA。

同时要区分连接超时和读超时:

连接超时通常设置得短一些,比如几十毫秒到几百毫秒 读超时根据业务 SLA 和下游历史延迟设置 不建议使用框架默认超时,很多默认值偏大,会导致线程长时间阻塞

重试要控制预算,不能无限重试。

重试只适合处理短暂抖动,比如网络闪断、连接复用失败、偶发 5xx。对于明确的业务失败、参数错误、限流返回,一般不应该重

登录后查看完整内容