Agent AtlasAI Agent 知识库
05.07工程化 · Engineering

部署、延迟与成本

同步与异步、流式输出、缓存、并发、队列与可观测性:生产架构的十个关键决策。

部署 Agent 的难点不是「把服务跑起来」,而是:长任务怎么不超时、并发上来怎么不崩、成本怎么不失控、出问题怎么回滚。

参考架构

图 1 · 生产级 Agent 架构
接入层CDN / WAF / 鉴权 / 限流 / 请求校验
API 层同步短任务、SSE 流式、异步任务创建
队列 / 工作流长任务、重试、并发控制、定时
Agent Worker循环、工具、模型调用、上下文组装
数据层状态库、向量库、缓存、对象存储、审计
可观测Trace、指标、日志、告警、评估

不是每个项目都需要全部组件。但只要你做长任务或高并发,队列/工作流和数据层迟早要有。

同步、流式与异步

任务时长方式实现
< 5 秒同步 JSON普通 HTTP
5–30 秒流式SSE / WebSocket
30 秒–数分钟异步任务返回 task_id,轮询/推送
数分钟–数天工作流持久化执行 + 通知

经验法则:用户等待超过 10 秒,就应该给进度反馈;超过 30 秒,就应该异步化。

流式输出要注意:

  • 首 token 之前先发一个 status 事件,避免界面空白;
  • 工具调用时发送 tool_start / tool_end 事件;
  • 错误要在流里发送,而不是直接断开;
  • 客户端要能重连(带 last_event_id);
  • 代理层(Nginx、CDN)要关闭缓冲。

无状态与有状态

无状态 API + 外部状态最容易扩展:

text
请求 → 加载 state → 执行一步 → 保存 state → 返回

每一步都可以落到任意 worker,崩溃后可恢复。缺点是每步都要读写存储。

有状态会话(如 Durable Objects)适合:

  • 需要 WebSocket 长连接;
  • 多步任务需要强一致的状态;
  • 需要定时器/调度;
  • 同一会话串行处理。

选择取决于一致性需求与扩展方式。不要用进程内内存保存任务状态——部署、重启、扩容都会丢。

队列与工作流

长任务放进队列:

text
API → 创建 task(status=queued)→ 入队 → 返回 task_id
Worker → 消费 → 执行 → 更新 status/progress → 通知

要点:

  • 幂等消费:消息可能重复投递;
  • 可见性超时:处理时间超过租约会被重新投递;
  • 死信队列:多次失败后人工处理;
  • 进度上报:用户能看到「第 3/6 步」;
  • 取消:用户取消后,worker 要能停止;
  • 优先级:付费用户/紧急任务单独队列。

工作流(Temporal、Cloudflare Workflows 等)进一步提供持久化、补偿、跨天等待。

并发与限流

三层限流:

  1. 入口:每用户/租户 QPS、并发任务数;
  2. 模型:每分钟 token、请求数,避免触发供应商 429;
  3. 工具:每个下游独立并发池,避免拖垮。
python
limiter = TokenBucket(rate=60, burst=10)  # 每用户

if not limiter.allow(user_id):
    return 429, {"retry_after": limiter.retry_after(user_id)}

并发不是越高越好。Agent 的每次请求可能持续几十秒,占用连接和内存。按「同时进行的任务数」而不是 QPS 估算容量。

缓存

缓存内容失效
提示缓存系统提示、工具定义内容变化
检索缓存query → 文档 ID文档更新
工具缓存只读查询结果TTL / 事件
语义缓存相似问题 → 答案谨慎,需校验
会话缓存最近消息TTL

语义缓存风险最高:两个问题「看起来相似」但答案不同(例如不同订单),会返回错误结果。至少要带 scope 过滤和相似度阈值。

容量估算

text
并发任务数 = 峰值 QPS × 平均任务时长
模型并发   = 并发任务数 × 平均每任务模型调用数 / 平均调用时长

例:峰值 20 QPS,平均任务 30 秒 → 600 个并发任务。如果每个任务 5 次模型调用、每次 3 秒,模型侧并发约 1000。这通常会超过供应商配额,需要排队、限流或分批。

不要只看平均。P95 任务可能跑 3 分钟,长尾会占住资源。

SLO

定义可测量的目标:

  • 可用性 99.9%;
  • 同步请求 P95 < 8 秒;
  • 异步任务 95% 在 5 分钟内完成;
  • 任务成功率 > 90%;
  • 单任务成本 < 0.5 元;
  • 安全拦截零漏报(对已知攻击集)。

SLO 要能驱动架构决策。例如「P95 < 8 秒」可能要求跳过重排、限制步数、流式输出。

发布与回滚

Agent 的「版本」包括:

  • 代码;
  • 提示词;
  • 模型版本;
  • 工具 Schema;
  • 知识库索引。

发布策略:

  1. 灰度:5% → 20% → 50% → 100%;
  2. 影子:新版本只记录不返回,对比质量;
  3. 开关:按用户/租户启用;
  4. 回滚:提示词、模型、代码都能一键切回;
  5. 数据兼容:State Schema 变更要考虑旧检查点。

不要同时改多个变量。一次只改一个,跑完评估再继续。

成本控制

  • 每租户预算与配额;
  • 单任务硬上限;
  • 模型路由;
  • 提示缓存;
  • 工具结果裁剪;
  • 输出长度限制;
  • 异常用量告警;
  • 按功能/租户拆分账单。

一个实用做法:在 API 层给每个请求打上 tenant_id、feature、prompt_version,账单可以按维度聚合。否则月底只知道「总费用涨了」,不知道从哪来。

部署形态

形态优点缺点适合
Serverless免运维、弹性超时、冷启动、状态受限短任务、事件驱动
容器可控、长任务运维、扩缩容复杂 Agent
边缘低延迟、就近运行时限制轻量推理/编排
托管平台快锁定、黑盒验证与中小项目

混合很常见:边缘/Serverless 接入 + 容器跑长任务 + 托管向量库。

反模式

在 HTTP 请求里跑 5 分钟任务

网关超时、连接断开、用户以为失败。超过 30 秒就异步化。

用内存存任务状态

扩容/重启就丢。状态必须外部化。

不设并发上限

供应商 429、成本飙升、下游被打挂。

一次发布改所有东西

出问题无法归因。灰度、单变量、可回滚。

只监控服务存活

Agent 活着但答得不对,也是故障。质量指标要进监控。

检查清单

  • 按任务时长选择同步/流式/异步
  • 状态外部化,可恢复
  • 长任务走队列/工作流,幂等消费
  • 三层限流与并发上限
  • 缓存有 scope 与失效策略
  • 有 SLO 与容量估算
  • 发布可灰度、可回滚
  • 成本按租户/功能可归因
  • 质量指标进监控
  • 有降级与人工兜底

小结

  • 部署的核心是任务时长、状态、并发与成本,而不是「用哪个云」。
  • 超过 30 秒异步化,状态外部化,长任务用队列/工作流。
  • 限流分入口、模型、工具三层。
  • 版本包括代码、提示、模型、工具、索引,必须能一起回滚。
  • 成本要能按维度归因,否则无法优化。

下一篇看一个具体的部署平台:Cloudflare 的 Workers、Durable Objects 与 Agents SDK。

读完了?进度会保存在本地浏览器。
内容会持续修订。发现错误或想补充,欢迎反馈。 遇到问题?查排查手册 →