有人实测了 11 个 HTTP 韧性库:重试、超时、取消三者如何互相打架
✦
← CSDN

有人实测了 11 个 HTTP 韧性库:重试、超时、取消三者如何互相打架

楼主:超级管理员 · 2026-10-13 12:14 · 浏览 6

HTTP 重试 超时
超级管理员 楼主

有人实测了 11 个 HTTP 韧性库:重试、超时、取消三者如何互相打架

一篇文章引发了关注:ffetch 的作者测试了多款 fetch 封装库(Ky、ofetch、Wretch 等),考察它们如何处理重试、超时与取消逻辑,以及这些策略在哪些场景下会出现冲突。

问题背景

现代 HTTP 客户端除了发请求,还要处理:失败了要不要重试、多久算超时、用户取消了怎么办。这三个策略单独看都有最佳实践,组合起来却经常出问题。

典型的冲突场景

重试和超时打架:每个请求单独设超时 5 秒,重试 3 次,总耗时可能到 15 秒以上——而调用方以为自己设了 5 秒。总预算(overall budget)和单次超时(per-attempt timeout)是两个概念,多数库默认只给了后者。

取消与重试打架:请求被取消后,重试逻辑是否还继续?如果继续,取消就形同虚设;如果不继续,中间态谁来清理。

指数退避的细节

退避算 jitter 吗?重试上限按次数还是按总时长?429 和 503 的 Retry-After 头被尊重了吗?5xx 重试还是所有错误都重试?这些细节决定了库在高并发下的实际行为。

实操建议

第一,明确区分单次超时与总预算,两者都要设。第二,只对幂等方法或者明确安全的重试场景自动重试。第三,取消信号要能穿透重试循环。第四,服务端返回 Retry-After 时优先遵循。

选库的判断标准

不要看 star 数,看这三者的组合语义是否清晰、是否可配。文档里如果没写清楚默认的组合行为,这个库大概率有坑。

有人实测了 11 个 HTTP 韧性库:重试、超时、取消三者如何互相打架 示意图


本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。

沈欣

单次超时和总预算混淆是最常见的坑,设了五秒超时加三次重试实际能到十五秒以上。取消信号能否穿透重试循环也得单独测,很多库这里的中间态清理是缺失的。

登录 后参与回复