[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f4iVpUtNgSf6sE4mSFvi8aH9cDePPXNdTolv_Wkckpwo":3},{"item":4,"related":48},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":7,"seoDescription":9,"canonicalUrl":39,"isFeatured":43,"sno":44,"sortOrder":45,"publishedAt":46,"updatedAt":47,"createdAt":47},"67479210-59f6-4368-8ef0-307bb03e51d7","article","Hedged Requests：为什么同一个请求有时会被同时发两次？","hedged-requests-tail-latency-explained","Hedged Requests 在主请求短暂变慢时向另一个副本发起备用请求，用少量额外流量降低长尾延迟。本文区分对冲请求与普通重试，解释它的适用边界、幂等要求和 AI 服务中的使用场景。","分布式系统里，平均延迟往往看起来不错，但总有少量请求特别慢。一个请求可能恰好落到繁忙的机器、遭遇网络抖动，或者等待一项偶发的后台任务。如果用户必须等最慢的那一小批请求，整体体验就会被长尾延迟拖住。Hedged Requests，中文可称为“对冲请求”，是一种处理长尾延迟的方法。\n\n## 它不是普通重试\n\n普通重试通常发生在请求失败、超时或明确返回错误之后。对冲请求则会先发送一个主请求，等待很短时间；如果它还没有完成，就向另一个副本或不同路径发起备用请求，最终采用先返回的结果，并取消或忽略较慢的那一个。\n\n这样做相当于用少量额外流量换取更低的极端延迟。Google 的 The Tail at Scale 讨论过这种思路：不要只盯着平均值，而要针对少数慢请求设计容错机制。\n\n## 为什么不能到处使用\n\n对冲会增加请求量。如果操作有副作用，例如扣款、发货或写入订单，重复执行可能造成严重问题。它更适合读请求、幂等查询或有明确去重键的操作。即使是读请求，也要考虑两个副本同时返回不同版本数据的问题。\n\n延迟阈值也不能拍脑袋设置。太短会制造大量备用请求，太长又无法改善长尾。通常需要观察分位数延迟、取消比例、额外流量和后端负载，再选择合适的等待时间。\n\n## 对 AI 服务有什么启发\n\n一次 AI 请求可能经过模型、检索、工具和多个网络服务。长尾不一定来自模型本身，也可能来自流水线中的某个慢环节。对冲可以用于可替换的检索副本或只读服务，但必须配合预算、取消传播和幂等设计。\n\n## 读者应该记住\n\nHedged Requests 的思路是“不要把用户交给最慢的那条路径”。它适合在可控的额外成本下压低尾延迟，但不适合无脑复制所有有副作用的请求。\n\n资料：[Google Research：The Tail at Scale](https:\u002F\u002Fresearch.google\u002Fpubs\u002Fthe-tail-at-scale\u002F)；[论文全文](https:\u002F\u002Fwww.andrew.cmu.edu\u002Fuser\u002Fgaurij\u002F18-847F-Readings\u002Ftail_at_scale.pdf)","\u002Fuploads\u002F2026-09-20\u002F487383e7-976a-480b-98e8-83fbc8e23446.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"88d2bc27-0e0f-468a-b907-2991cb97b87b","人工智能","ai",{"id":28,"name":29,"slug":30},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",null,"Google Research：The Tail at Scale","https:\u002F\u002Fresearch.google\u002Fpubs\u002Fthe-tail-at-scale\u002F","published",false,48,0,"2026-09-20T00:00:00.000Z","2026-09-20T03:58:11.850Z",[49,57,67],{"id":50,"type":6,"title":51,"slug":52,"summary":53,"coverUrl":54,"authorName":14,"sno":55,"publishedAt":46,"createdAt":56},"cd0e6488-ef7a-4e2f-a600-3a19b667560f","Circuit Breaker：服务连续报错时，为什么要主动断路？","circuit-breaker-distributed-resilience-explained","Circuit Breaker 通过 Closed、Open、Half-Open 状态限制持续故障的远程调用，防止重试把局部问题扩大成级联故障。本文解释它与超时、重试、限流和降级的关系，以及 Agent 调用外部工具时的用法。","\u002Fuploads\u002F2026-09-20\u002F8067408e-5510-47a1-a38e-a9026841715a.jpg",54,"2026-09-20T03:58:10.337Z",{"id":58,"type":6,"title":59,"slug":60,"summary":61,"coverUrl":62,"authorName":63,"sno":64,"publishedAt":65,"createdAt":66},"9c77fbc0-6422-4ae3-bf41-9a592e3a53e1","A2UI：AI Agent 为什么不应该只返回一段文字","a2ui","A2UI 把 Agent 的界面意图与客户端的组件实现分开：模型选择要展示的卡片、表单或动作，宿主应用负责白名单、权限、渲染和安全。本文用订票场景讲清 A2UI 的四层结构、跨端复用、流式更新与落地护栏。","\u002Fuploads\u002F2026-08-05\u002Fb6291296-7a17-44a7-b288-83ebc0072068.jpg","Foundit AI",67,"2026-08-02T00:00:00.000Z","2026-08-05T02:12:50.323Z",{"id":68,"type":6,"title":69,"slug":70,"summary":71,"coverUrl":72,"authorName":14,"sno":73,"publishedAt":74,"createdAt":75},"9ccde95c-d754-4808-91f7-488f392e3eeb","你的品牌在AI眼里到底存不存在？这套系统说了算","automated-geo-monitoring-system","靠手动抽查来验证GEO效果，本质上是在跟概率玩游戏。赢一次，不代表能一直赢。","\u002Fuploads\u002F2026-08-07\u002Fdf111c0d-f14a-4b2a-8347-141e96b71654.jpg",1,"2026-08-07T00:00:00.000Z","2026-08-07T04:31:30.843Z"]