news 2026/10/28 15:24:50

推理网关的重试预算:过载时别让客户端把洪峰翻倍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
推理网关的重试预算:过载时别让客户端把洪峰翻倍

一次超时之后,客户端重试;网关也重试;上游 SDK 再重试。表面上只处理一个问题,后台可能已经出现多份相同请求。生成任务又往往耗时长,旧请求即使失去连接,也可能继续占着推理资源。

因此重试策略不能只写“最多三次”。先明确谁负责重试、哪些失败允许重试、全链路还剩多少时间,以及重复请求如何关联。缓存复用和路由能降低部分工作,但不会自动提供幂等语义。Dynamo 的路由与调度范围也应与应用层的请求去重区分开。

把总时间预算带过每一次尝试

下面是纯离线决策器:输入预先给定的结果和耗时,不发网络请求、不 sleep。request_id标识同一个业务请求,attempt_id区分它的各次尝试。服务端要实现去重,还需要自己的持久或有界记录,不能只靠传一个字符串。

from dataclasses import dataclass @dataclass(frozen=True) class Result: status: int elapsed_ms: int RETRYABLE = {429, 503} def replay(request_id, outcomes, budget_ms, backoff_ms=10, max_attempts=3): if budget_ms <= 0 or backoff_ms < 0 or max_attempts < 1: raise ValueError("invalid policy") used, trace = 0, [] for i, result in enumerate(outcomes[:max_attempts], 1): if result.elapsed_ms < 0 or used + result.elapsed_ms > budget_ms: return "deadline", trace used += result.elapsed_ms trace.append((request_id, i, result.status, used)) if 200 <= result.status < 300: return "success", trace if result.status not in RETRYABLE: return "stop", trace if i == max_attempts or used + backoff_ms >= budget_ms: return "exhausted", trace used += backoff_ms return "no_more_results", trace state, trace = replay("r1", [Result(503, 20), Result(200, 30)], 100) assert state == "success" and trace[-1][-1] == 60 assert replay("r2", [Result(400, 5), Result(200, 5)], 100)[0] == "stop" assert replay("r3", [Result(503, 20)], 30)[0] == "exhausted" print(state, trace)

示例把 429 和 503 作为可重试状态,仅说明策略形式;真实接口可能要求读取Retry-After,某些请求即使收到这两种状态也不适合立即重放。流式输出已经提交一部分时,更不能把新响应直接接到旧文本后面。

预算还需要在群体层面受控

每条请求最多三次,在所有请求同时失败时仍可能造成三倍尝试。网关通常还需要总重试额度、并发上限与随机退避。随机抖动应来自独立分布,避免所有客户端在同一个固定间隔重新冲向后端。

超时不是“上游确定没执行”。晚到响应与取消消息需要用 attempt 身份核对,不能误释放新一轮的资源预留。若业务有外部副作用,幂等键的保留时间、结果缓存和冲突行为必须由接口契约定义。

这里没有实现 HTTP 客户端或生产级重试库,也未验证服务端取消、去重和网络故障。它能检查有限预算下的决策次序,不能证明重试带来了更高成功率。上线前应同时统计原始请求数、尝试数、有效完成数和被取消后仍消耗的工作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 15:24:28

显存高不等于该扩容:推理服务需要排队与预热联合信号

模型加载完后&#xff0c;即使一条请求也没有&#xff0c;显存占用也可能很高。反过来&#xff0c;显存还没满&#xff0c;排队的长提示已经能把首字延迟拖垮。用一个显存百分比控制扩容&#xff0c;很容易在这两种场景里做反决定。 10 月 19 日 vLLM 的 Elastic EP 介绍了把背…

作者头像 李华
网站建设 2026/10/28 15:24:01

cloudflare-os:用 Rust/WASM 在浏览器里实现云桌面与文件系统

说实话&#xff0c;我第一次看到 cloudflare-os 这个项目名的时候&#xff0c;第一反应是“谁这么大胆&#xff0c;敢用 OS 来命名一个浏览器项目”。但深入了解之后发现&#xff0c;这恰恰是它最值得玩味的地方&#xff1a;它把操作系统的交互范式整体搬到了浏览器里&#xff…

作者头像 李华
网站建设 2026/10/28 15:21:00

PCB封装命名规范:尺寸编码、焊盘命名与库管理

简介&#xff1a;这是一份面向硬件工程师、PCB Layout 设计者及封装库管理人员的 PCB 封装命名规范文档&#xff0c;针对元器件库命名混乱、设计与生产衔接不一致等问题&#xff0c;提供可参照的标准化规则。压缩包共 1 个 docx 文件&#xff0c;约 1.63MB&#xff0c;以文字规…

作者头像 李华
网站建设 2026/10/28 15:20:45

印制电路手册:PCB设计制作与制造检测全流程解析

简介&#xff1a;《印制电路手册》第6版中文高清版面向电子工程师、PCB设计师与制造工程师&#xff0c;系统梳理从设计基础、布局布线原则到制造工艺、检测标准及应用趋势的完整知识框架&#xff0c;适合查阅规范、补齐概念与对照实际项目。包内为1个PDF文件&#xff0c;约246.…

作者头像 李华
网站建设 2026/10/28 15:18:35

MySQL事务原理与实战:ACID特性与高并发优化

1. MySQL事务的本质与核心价值从事数据库开发这些年&#xff0c;我处理过太多因为事务使用不当导致的数据灾难。记得有一次电商大促&#xff0c;由于未正确处理事务边界&#xff0c;导致库存超卖2000多件商品&#xff0c;直接损失超百万。这个惨痛教训让我深刻认识到&#xff1…

作者头像 李华