主题
AI 网关与异步任务
一句话:网关只做准入、转发与记录,不夺业务权威;异步任务把执行从请求里解耦出来,用队列、调度器和状态机承接长任务。两者都在回答同一个问题——怎么让 Agent 跑得久、跑得稳,而不是跑得侥幸。
对应原书:第 9 章《AI 网关与统一流量治理》、第 10 章《Agent 异步任务与自动化流程》。
为什么需要
同步请求在长任务上会依次撞墙:HTTP 超时、上下文溢出、用户必须在线、等待外部事件时进程白占资源。于是团队开始加队列、加定时任务、加回调,但常见做法是把三件不同的事塞进一个组件:
- 队列管积压,也管重试,还管业务状态;
- 调度器既做触发又做执行;
- 回调既当通知又当完成依据。
结果是一出问题就说不清:任务丢了是入队失败还是消费失败?重复执行是重试还是回调重放?超时了到底有没有执行?
网关侧同理:把鉴权、限流、路由、计量、审计全部堆在一个入口,看起来很统一,但一旦网关开始“判断业务是否成功”,它就从基础设施变成了业务系统,而且是最难改的那个。
核心机制
一、三类网关,三种流量语义
| 网关 | 管什么 | 不做什么 |
|---|---|---|
| LLM 网关 | 模型路由、降级、按 token 计量 | 判断输出是否满足业务标准 |
| MCP 网关 | 工具发现、鉴权、隔离 | 把“可发现”当成“已授权、健康、可执行” |
| Agent 网关 | 入口、租户配额、任务关联 | 定义 Task、业务状态、检查点或恢复语义 |
三者可以共用一个策略执行点,但要按流量类型隔离数据面。
二、AI 流量的四类新约束
- 长连接与流式:SSE 只是传输形式,字节切片可能包含半个事件或多个事件;首 token 不等于首字节。超时要分五类:连接、首字节、首 token、流式空闲、总时限。
- 大请求体:缓冲内存成本、增量解析能力都要提前评估。
- 按 token 计费:准入时估算,结束时才知道实际值;限流、配额、预算必须分开建模。
- 多轮长程任务:会话亲和有利于缓存,但 KV 缓存复用是性能优化,不是业务状态恢复。
三、预算四档:只有严格预算能承诺硬上限
| 档位 | 计量对象 | 结算 | 能否硬上限 |
|---|---|---|---|
| 速率限制 | QPS | 每秒准入 | 否 |
| token 时间窗 | 窗口累计 | 窗口结算 | 否,窗口边界会突刺 |
| 余额配额 | 余额 | 先查后扣 | 否,并发下会超限 |
| 严格预算 | 输入 + 受约束最大输出 + 计费项 | 原子预留 + 幂等结算/退款 | 是 |
典型漏洞:余额 100,两笔最大消耗 80 的请求同时通过准入,最终花掉 160。“请求前检查、响应后扣减”永远做不到硬上限,必须有原子预留。
四、重试要算总账
错误分类先于重试:限流看重置时间,服务端错误看调用语义,认证错误直接终止,上下文超限不能简单截断历史。
重试预算是跨层相乘的:SDK 一次逻辑调用最多 3 次,网关每次转发最多 3 次,最多 9 次到达上游;供应商侧是否重投还不受你控制。所以总截止时间要用绝对时间,剩余额度由调用方给出,网关按 call_id 原子扣减。
还有一条容易忘:尚未收到响应体,不等于上游尚未执行。
五、MCP 准入四步与“不可绕过”
认证(谁在调用)→ 协议校验(版本、头部、方法、报文)→ 授权(主体、工具、参数)→ 转发(重新构造请求)。发现不等于授权,协议说明不等于身份证明,tools/list 过滤也不等于 tools/call 不再鉴权。
网关要成为不可绕过的策略点,需要五个前提同时成立:凭证不下发、出口网络受控、服务发现与域名解析收敛、直连路径禁止、旁路可审计。缺一个,“不可绕过”就只是口号。
有效权限是交集:调用者授权 ∩ 工作负载授权 ∩ 任务委托 ∩ 资源端限制。显式拒绝优先。
六、异步任务的三组件与九态
三件事必须分开,否则出了故障分不清是入队失败、消费失败,还是状态迁移本身不合法:
- 队列负责排序、去重和积压降级(拒绝入队并返回结构化错误、低优先级限速、告警扩容);
- 调度器负责投递、维护租约、处理重试与故障转移,背压由它做(并发配额、队列水位、消费速率自适应、租约超时);
- 状态机只负责合法迁移,九态:waiting、queued、running、hold、succeeded、failed、killed、skipped、mark_succeeded。
存储选型几乎没有悬念:内存重启即失,文件在机器不可用时不可达,数据库才是权威源,缓存只做加速。
七、状态监听:没有一种信号可以单独信任
- 轮询:控制权集中,但单次失败不等于任务异常,要用租约或心跳判定;
- 回调:实时,但依赖对方“诚实回报”,崩溃时可能永远不来;
- 共享存储:权威持久化,但变更通知可能丢(断连、落后、压缩)。
生产组合是:回调为主 + 轮询或租约兜底 + 共享存储做权威。信号缺失时,以权威 Task State 重新对账。
八、定时任务与完成语义
定时任务和事件触发共享同一条执行链:都向队列投递 Task,共用调度、并发控制、重试与对账。要显式约定时区、错过与重叠策略——run_once(只补最新)、run_all(全部补跑)、skip、prompt(转人工)。发生标识用“调度 ID + 计划时间”,补跑才能幂等。
完成语义分五层,不能混:
| 层 | 由谁判定 |
|---|---|
| 执行状态 | Runtime:跑没跑完 |
| 运维状态 | Worker 在线、租约有效 |
| 候选证据 | 原始材料 |
| Evidence | 被成功标准引用的材料 |
| 业务 Outcome | 业务应用或授权 Verifier |
LLM-as-Judge 是评估实现,不是 Outcome 权威;”强制标记成功”只改执行状态并留审计,不改变业务结论。
九、工作流:DAG 型编排
异步任务、定时任务、工作流分别描述执行方式 / 触发方式 / 编排结构,可自由组合。工作流用 DAG 表达编排结构:
- 业务节点:Agent 调用 / 工具调用 / 代码执行 / 知识检索 / 人工审批 / 通知推送
- 逻辑节点:条件分支 / 并行 / 汇聚 / 循环 / 等待 / 错误处理 / 子工作流(循环用有界展开,图保持无环)
- 就绪条件:普通依赖(succeeded/skipped);AND Join(全部终态 + 策略);OR Join(任一即就绪,显式取消未选分支,迟到结果进审计日志)
落地关键不在堆叠组件,而在分清责任边界:Task 权威在业务应用;恢复与幂等不能外包(去重/幂等/围栏/对账/补偿);Checkpoint 断点恢复让进程无状态化,幂等局部重跑(复用 ≠ 副作用幂等,已发生只能补偿);可视化运维支持重跑/跳过/标记成功/暂停/终止。
最小上手
yaml
gateway:
budget: {mode: strict, reserve: true, idempotent_settle: true}
retry: {max_attempts: 3, total_deadline: absolute, remaining_quota_from_caller: true}
mcp_admission: [authenticate, validate_protocol, authorize, reforward]
task_queue:
order: priority_then_fifo
overflow: [reject_with_error, throttle_low_priority, alert]
states: [waiting, queued, running, hold, succeeded, failed, killed, skipped, mark_succeeded]
scheduler:
lease: heartbeat
backpressure: [concurrency_quota, queue_watermark, adaptive_rate, lease_timeout]验收看四件事:并发下预算不会被击穿;回调丢失后任务能被对账找回;重启后队列与状态机一致;审批超时不会自动放行。
生产动作
- 排队也给上限。队列无界等于把过载变成延迟,最后一起超时。
- 审批挂起不要长连接。审批可能持续数天,用持久化状态承接,批回来后必须重新准入。
- 外置调度不接管业务状态。它降低重复触发概率,但不替业务做幂等。
- 账本分清楚。Task → Session → Turn → Call → Attempt 是关联账本;网关日志只是调用账本的一部分,Trace 不是财务权威账本。
边界
- 网关不拥有任务真相。它保留关联信息,入口重启不应导致任务状态丢失。
- 集中入口不等于不可绕过。凭证仍下发、出口未受控时,直连路径依然存在。
- 自适应路由只能在授权范围内工作。它不能自行扩大模型范围、权限或预算。
- 回调不能作为唯一完成依据。崩溃、网络分区、对方实现缺陷都会让回调消失。
- Checkpoint 复用不等于副作用幂等。已经写出去的外部操作只能补偿,不能靠重放撤销。
讲清楚
网关的职责边界是“准入、转发、记录”:三类网关分别面对模型、工具和 Agent 入口,只做策略执行,不判断业务成功,也不定义任务状态。硬预算只能靠原子预留与幂等结算实现,重试预算要按层相乘计算总账。MCP 准入要分认证、协议校验、授权、重新构造四步;“不可绕过”依赖凭证不下发、出口受控、解析收敛等前提同时成立。
异步任务的三个组件不能混层:队列管排序与积压,调度器管租约与背压,状态机管合法迁移。完成语义分执行、运维、证据、Evidence、业务 Outcome 五层,只有业务应用或授权 Verifier 能判最后一种。回调、轮询、共享存储三者互补,缺一个就会出现“任务丢了但没人知道”。
适用:Agent 流量治理与长任务平台 | 初稿 2026-10