跳到正文

AI 网关与异步任务 ​

一句话:网关只做准入、转发与记录,不夺业务权威;异步任务把执行从请求里解耦出来,用队列、调度器和状态机承接长任务。两者都在回答同一个问题——怎么让 Agent 跑得久、跑得稳,而不是跑得侥幸。

对应原书:第 9 章《AI 网关与统一流量治理》、第 10 章《Agent 异步任务与自动化流程》。

为什么需要 ​

同步请求在长任务上会依次撞墙:HTTP 超时、上下文溢出、用户必须在线、等待外部事件时进程白占资源。于是团队开始加队列、加定时任务、加回调,但常见做法是把三件不同的事塞进一个组件:

  • 队列管积压,也管重试,还管业务状态;
  • 调度器既做触发又做执行;
  • 回调既当通知又当完成依据。

结果是一出问题就说不清:任务丢了是入队失败还是消费失败?重复执行是重试还是回调重放?超时了到底有没有执行?

网关侧同理:把鉴权、限流、路由、计量、审计全部堆在一个入口,看起来很统一,但一旦网关开始“判断业务是否成功”,它就从基础设施变成了业务系统,而且是最难改的那个。

核心机制 ​

一、三类网关,三种流量语义 ​

网关管什么不做什么
LLM 网关模型路由、降级、按 token 计量判断输出是否满足业务标准
MCP 网关工具发现、鉴权、隔离把“可发现”当成“已授权、健康、可执行”
Agent 网关入口、租户配额、任务关联定义 Task、业务状态、检查点或恢复语义

三者可以共用一个策略执行点,但要按流量类型隔离数据面。

二、AI 流量的四类新约束 ​

  1. 长连接与流式:SSE 只是传输形式,字节切片可能包含半个事件或多个事件;首 token 不等于首字节。超时要分五类:连接、首字节、首 token、流式空闲、总时限。
  2. 大请求体:缓冲内存成本、增量解析能力都要提前评估。
  3. 按 token 计费:准入时估算,结束时才知道实际值;限流、配额、预算必须分开建模。
  4. 多轮长程任务:会话亲和有利于缓存,但 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

把 AI 工程讲到既懂也会用