<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>HttpResilience_对比测试_Retry_CircuitBreaker_Hedging_取消与超时正确性 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《我实测了11个HTTP弹性库的21个场景，结果如何？》</title><link>https://channel.meo-ai.com/posts/716</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/716</guid><pubDate>Thu, 08 Oct 2026 02:00:14 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《我实测了11个HTTP弹性库的21个场景，结果如何？》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91&quot; title=&quot;#软件开发&quot;&gt;#软件开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HttpResilience_%E5%AF%B9%E6%AF%94%E6%B5%8B%E8%AF%95_Retry_CircuitBreaker_Hedging_%E5%8F%96%E6%B6%88%E4%B8%8E%E8%B6%85%E6%97%B6%E6%AD%A3%E7%A1%AE%E6%80%A7&quot; title=&quot;#HttpResilience_对比测试_Retry_CircuitBreaker_Hedging_取消与超时正确性&quot;&gt;#HttpResilience_对比测试_Retry_CircuitBreaker_Hedging_取消与超时正确性&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;作者在开发自己的 fetch 弹性封装库 ffetch 时发现了大量隐藏的正确性问题，于是搭建了一套覆盖 21 个场景的测试矩阵，对 11 个流行的 HTTP 弹性库（包括自己 ffetch 5.7.1）进行横向对比。结果显示：基础的&quot;重试&quot;行为在所有库中都表现良好，但 25 个失败几乎全部集中在&lt;b&gt;组合场景&lt;/b&gt;——取消发生在退避等待中、超时与重试叠加、队列中的请求被取消、熔断器半开状态下迟到响应等。作者也坦承测试套件源自自己修过的 bug，存在确认偏差，且部分判定标准（如取消后必须立即停止派发）严于官方文档。矩阵每周自动重建并公开于 &lt;a href=&quot;http://fetchkit.org/http-resilience%E3%80%82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;fetchkit.org/http-resilience。&quot;&gt;fetchkit.org/http-resilience。&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 测试方法很扎实：21 个场景覆盖重试、超时、熔断、舱壁、对冲、请求去重，用脚本化 fetch + Vitest 假定时器精确控制中止时刻，jitter 固定 random=0.5，并附 2 个真实 node:http 集成场景。&lt;br /&gt;&lt;br /&gt;2. 全部 11 个库都通关的&quot;共同强项&quot;是基础重试类场景：重试恢复、重试耗尽、零重试、真实 HTTP 重试、请求体字节级回放，共 55/147 个实现单元。&lt;br /&gt;&lt;br /&gt;3. 失败高度聚类于&quot;组合场景&quot;：典型如&quot;重试 + 退避中取消&quot;，fetch-&lt;mark class=&quot;highlight&quot;&gt;retry&lt;/mark&gt;、ofetch、wretch、resilient-fetch-client、fetch-resilience、&lt;a href=&quot;https://t.me/resili&quot; target=&quot;_blank&quot; title=&quot;@resili&quot;&gt;@resili&lt;/a&gt;/fetch 六库会延迟结算甚至取消后继续派发请求；fetch-&lt;mark class=&quot;highlight&quot;&gt;retry&lt;/mark&gt; 的源码问题暴露——退避用的是裸 &lt;code&gt;setTimeout&lt;/code&gt;，从不读 &lt;code&gt;init.signal&lt;/code&gt;。&lt;br /&gt;&lt;br /&gt;4. 舱壁队列几乎全军覆没：五家有队列的库中四家在&quot;排队请求被取消&quot;场景全挂——取消的调用方仍占着坑位不放，替换请求被拒，个别还照样派发了已取消的请求，ffetch 是唯一通过者。&lt;br /&gt;&lt;br /&gt;5. 重试 + 整体超时、&lt;mark class=&quot;highlight&quot;&gt;Retry&lt;/mark&gt;-After + 取消、hooks 抛错等场景暴露多家库&quot;超时只罩单次尝试不罩重试循环&quot;、回调拒绝后调用方永久挂起等问题，wretch 甚至会变成一个永远 await 的悬空 Promise。&lt;br /&gt;&lt;br /&gt;6. 对冲（&lt;mark class=&quot;highlight&quot;&gt;hedging&lt;/mark&gt;）是最不成熟的表面：仅三个库提供带可配置启动延迟的对冲；flowshield 在所有超时设置下都失败，超时后仍启动对冲分支且分支不收手，等于白发给服务器一个没人等的请求。&lt;br /&gt;&lt;br /&gt;7. 熔断器组合场景里作者自己的 ffetch 也栽了：半开状态下迟到成功响应会错误清除新开启状态（缺代次计数器）；fetch-smartly 和 ts-&lt;mark class=&quot;highlight&quot;&gt;retry&lt;/mark&gt;-circuit 更严重，新冷却期被误清导致下一个请求吃掉本应给健康调用方的恢复响应。&lt;br /&gt;&lt;br /&gt;8. 作者最后强调方法论局限：无性能基准、无 API 设计评价，场景源于自己修过的 bug 存在确认偏差；建议读者不要只看&quot;功能有没有&quot;，而要按自己应用的真实组合方式去测。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://blog.gaborkoos.com/posts/2026-10-04-I-Tested-11-Http-Resilience-Libraries/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.gaborkoos.com/posts/2026-10-04-I-Tested-11-Http-Resilience-Libraries/&quot;&gt;https://blog.gaborkoos.com/posts/2026-10-04-I-Tested-11-Http-Resilience-Libraries/&lt;/a&gt;</content:encoded></item></channel></rss>