每日学习笔记 · 8/10 — Agent 异步架构与编排
每日学习笔记 · 8/10 — Agent 异步架构与编排
当 Agent 走进生产环境,“调用即返回”的函数式思维就失效了。 今天的笔记把异步架构、协议、调度、可靠性一次性打通。
一、为什么 Agent 必须异步?
Agent 系统的特点决定了它不能像普通函数那样”调用即返回”。一次用户请求往往要拆解为:理解意图 → 规划任务 → 拆分子任务 → 并发调用工具/大模型 → 等待结果 → 检查依赖 → 汇总上下文 → 生成答复。整个过程涉及大量长耗时、不确定、可能失败的操作。
| 问题 | 具体表现 | 异步架构的作用 |
|---|---|---|
| 长耗时调用 | LLM、Web Search、代码执行持续数秒到数分钟 | 避免阻塞主线程,后台继续执行 |
| 多任务并发 | 一个请求拆为多个并行子任务 | 提升吞吐和响应速度 |
| 依赖编排 | 部分任务须等前置任务完成 | 使用 DAG / 状态机表达依赖 |
| 失败恢复 | 模型超时、工具失败、worker 宕机 | 持久化状态 + 重试 + 死信恢复 |
| 用户体验 | 用户希望看到进度而非长时间无响应 | 状态接口、SSE、WebSocket 推送 |
| 系统扩展 | 单进程无法承载大量并发 | 队列、worker pool、分布式调度 |
二、七类核心组件
Agent 异步架构由七类组件协同工作:状态存储负责事实,事件通知负责触发,调度器负责决策,大模型和工具运行时负责执行。
| # | 组件 | 职责 | 典型实现 |
|---|---|---|---|
| 1 | API / Session Service | 接收用户请求,维护会话,返回 run_id 或最终答复 | HTTP API、WebSocket Gateway |
| 2 | Planner | 将用户目标拆解为任务计划或 DAG | LLM Planner、规则引擎、模板化计划器 |
| 3 | Orchestrator | 推进 agent-loop,派发 Job,检查依赖,处理事件 | 自研调度器、工作流引擎、状态机 |
| 4 | Job Store | 保存子任务状态、输入、输出引用、错误、重试次数 | PostgreSQL、Redis、MongoDB、DynamoDB |
| 5 | Queue / Event Bus | 分发待执行任务和完成事件 | Kafka、RabbitMQ、Redis Stream、NATS |
| 6 | Worker / Tool Runtime | 执行 LLM 调用、工具调用、浏览器、代码、文件处理 | 线程池、进程池、容器、Serverless |
| 7 | Result / Context Store | 保存中间结果、证据、文件、模型输出、最终报告 | 数据库、对象存储、向量库 |
关键协作关系:Orchestrator 是 agent-loop 的中枢,但不亲自执行耗时任务。它只决定”下一步做什么”,再把执行交给 worker。worker 完成后把结果写入 Result Store,通过 Event Bus 发布 JobCompleted/JobFailed 事件,Orchestrator 消费事件后继续推进。
三、Agent Run 与 Job 状态模型
3.1 Agent Run 状态(整体任务)
| 状态 | 含义 | 典型触发条件 |
|---|---|---|
created | 请求已创建,尚未开始规划 | API 接收到请求并创建 run 记录 |
planning | 正在生成任务计划 | Planner 开始执行 |
executing | 子任务正在并发执行 | 至少一个 Job 已派发 |
waiting | 等待外部工具、用户确认或定时器 | 需要人工输入或外部回调 |
aggregating | 正在汇总多个子任务结果 | 关键依赖全部完成 |
responding | 正在生成最终答复 | 汇总结果已准备完成 |
completed | 整体任务成功完成 | 最终结果已写入会话或结果存储 |
failed | 整体任务不可恢复失败 | 达到最大重试次数或关键步骤失败 |
cancelled | 用户或系统取消任务 | 用户取消、超时或资源回收 |
3.2 Job 状态(子任务)
| 状态 | 含义 | 典型处理 |
|---|---|---|
pending | Job 已创建,尚未执行 | 等待依赖满足或调度 |
queued | Job 已进入队列 | 等待 worker 领取 |
leased | 已被某个 worker 领取 | 设置租约和心跳,避免重复执行 |
running | 正在执行 | 记录开始时间、worker ID、进度 |
succeeded | 成功完成 | 写入结果引用并发布完成事件 |
failed | 执行失败 | 记录错误,判断是否重试 |
retrying | 等待下一次重试 | 使用退避策略重新入队 |
dead_lettered | 多次失败后进入死信 | 等待人工排查或补偿处理 |
cancelled | Job 被取消 | 停止后续依赖任务或进入补偿流程 |
为什么需要这套状态机? 如果只依赖内存回调,进程退出后系统无法判断任务是否完成。借助 Job Store,worker 即使执行到一半崩溃,调度器也能通过心跳超时把卡在 leased/running 状态的任务重新置为 queued 或 retrying,实现可靠恢复。
四、同进程 vs 分布式 Agent 异步实现
| 架构能力 | 同进程 Agent | 分布式 Agent |
|---|---|---|
| 状态保存 | 内存对象 | 数据库、Redis、工作流状态存储 |
| 完成通知 | callback、Future | 消息队列、事件总线、Webhook、outbox |
| 执行资源 | 本地线程池或协程 | 多 worker、容器、Serverless、K8s job |
| 失败恢复 | 依赖进程存活 | 状态表 + 租约 + 重试 + 死信 |
| 扩展性 | 受单机资源限制 | 水平扩展 worker 和队列 |
| 适用范围 | demo、插件、小规模服务 | 生产级平台、多用户 SaaS、企业自动化 |
4.1 同进程实现机制
- Future / Promise:提交后返回未来结果对象,完成后可查询或回调
- Callback:任务完成后执行注册函数
- async / await:协程挂起等待异步结果,完成后恢复
- Condition / Event:线程等待共享条件变化,被唤醒
- Blocking Queue:worker 完成后结果入队,调度器消费
关键点:
add_done_callback只是把 Future 完成转换成 JobCompleted 事件,真正推进 agent-loop 的是 on_event() 中的依赖检查和后续派发。
4.2 分布式实现关键机制
- 租约机制(Lease):worker 领取任务后在 Job Store 设置 lease + 心跳,超时未续约则视为宕机
- 幂等:消息队列通常是至少一次投递,使用 event_id + job_id + version 保证幂等
- 事务 outbox:在同一 DB 事务中写入业务状态和待发布事件,由 outbox relay 异步投递
- 事件结构化:事件只携带 result_ref,避免大消息体撑爆队列
典型事件格式:
{ "event_id": "evt_001", "event_type": "JobCompleted", "agent_run_id": "run_20260522_001", "job_id": "T1", "job_type": "research_product", "status": "succeeded", "result_ref": "s3://agent-results/run_20260522_001/T1.json", "attempt": 1, "created_at": "2026-05-22T10:00:00+08:00"}五、任务完成通知机制对比
| 机制 | 原理 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| Future callback | 同进程任务完成后触发回调 | 单机 Agent、原型 | 简单、低延迟 | 进程崩溃后丢失 |
| 状态轮询 | 通过 run_id 查询状态 | HTTP 长任务、外部客户端 | 简单可靠、兼容性强 | 实时性差、轮询压力 |
| 消息队列事件 | worker 完成后发布消息 | 微服务、生产级平台 | 持久化、可重试、可削峰 | 引入 broker 运维 |
| Webhook | 完成后调用外部 URL | 第三方集成、企业回调 | 外部系统被动接收 | 需签名、幂等、防重放 |
| SSE / WebSocket | 后端推送进度到前端 | 实时查看执行过程 | 用户体验好 | 连接管理复杂 |
实践原则:轮询与回调不是非此即彼。状态查询提供可靠兜底,通知机制提供实时性。很多长任务 API 会同时提供这两种能力。
六、五项核心设计原则
最终推荐:状态可查询 + 事件可通知 + 结果可恢复 + 失败可重试 + 执行可观测
- 状态可查询:状态存储是事实来源,可恢复、可查询、可审计
- 事件可通知:通知驱动下游处理、降低延迟
- 结果可恢复:先写结果再发事件,结果引用指向持久化存储
- 失败可重试:退避策略 + 重试计数 + 死信队列
- 执行可观测:trace_id + run_id + job_id 全链路日志
可靠性黄金顺序:
worker 写结果到持久化存储 → 再发布事件如果需要强一致性,使用事务 outbox:在同一 DB 事务中写入业务状态 + 待发布事件,再由 relay 异步投递。即使事件消费者收到通知后立刻查询,也一定能读到结果。
已知挑战与应对
| 挑战 | 风险 | 应对策略 |
|---|---|---|
| 状态复杂 | Run 和 Job 状态不一致 | 定义明确状态机,集中管理状态迁移 |
| 事件重复 | 队列至少一次投递 | event_id + version 幂等 |
| 事件乱序 | 后发事件可能先到 | 携带版本号和时间戳,消费端校验 |
| 结果丢失 | 事件到了结果未落库 | 先写结果再发事件;事务 outbox |
| 调试困难 | 异步链路跨多组件 | trace_id / run_id / job_id 全链路日志 |
| 资源泄露 | 长任务、临时文件未清理 | TTL、心跳、租约、清理任务 |
| 成本上升 | 并发放大模型调用 | 配额、限流、优先级队列、模型路由、缓存 |
| 用户取消 | 已派发任务仍在执行 | 取消信号 + 协作式取消 |
七、多 Agent 系统的”操作系统”:三大核心支柱
多 Agent 系统是 AI 从”单点智能”迈向”群体智慧”的关键,其核心是任务调度、通信协议、状态管理与可靠性设计。
7.1 主流架构范式
| 范式 | 核心机制 | 设计理念 | 典型场景 | 代表框架 |
|---|---|---|---|---|
| 管理者/协调者模式(集中式) | 中央协调者负责任务接收、规划分解、调度派发 | 模拟”项目经理-执行团队” | 金融合规、智能制造排产、标准化客服 | CrewAI、LangGraph |
| 去中心化/对等网络(分布式) | 无单一控制中心,Agent 基于预定义规则直接 P2P 通信 | 模拟”蜂群”对等协商 | 开放式市场调研、头脑风暴、动态信息搜集 | AutoGen GroupChat |
| 混合式架构 | 主干流程集中式,局部环节分布式 | 平衡可控性与灵活性 | 复杂软件研发、智能运维(AIOps) | LangGraph + CrewAI 定制组合 |
关键数据:研究表明,正确采用多智能体协作架构可实现错误率降低 65%、执行速度提升 40%。
7.2 任务调度策略
- 并行调度:多个无依赖任务同时进行(数据抓取与批量推理)
- 依赖图调度:任务之间形成 DAG(“先检索→再分析→最后总结”)
- 优先级调度:根据任务紧急程度动态分配资源
- 资源感知调度:实时监测 Agent 负载,实现负载均衡
7.3 通信协议双轨
- A2A(Agent-to-Agent):横向协议,负责 Agent 间协调与任务委托
- MCP(Model Context Protocol):纵向协议,负责 Agent 与外部工具/数据集成
典型架构:A2A 上层编排,Agent 通过 MCP 执行具体动作。
八、A2A 协议:Agent 间的”通用语言”
A2A 是 Google 于 2025 年发起并贡献至 Linux 基金会的开源协议,目标是建立跨厂商、跨框架的标准化互操作机制。
8.1 协议栈
- 传输:HTTP(S) + mTLS
- 消息格式:JSON-RPC 2.0
- 核心抽象:
- Agent Card:JSON 格式数字身份,托管于
/.well-known/agent-card.json,便于发现 - Task:异步协作核心载体,拥有唯一 ID、生命周期状态(已提交/处理中/已完成)和 contextId
- Agent Card:JSON 格式数字身份,托管于
8.2 四种交互模式
| 模式 | 适用场景 |
|---|---|
| 同步请求/响应 | 快速即时操作 |
| 异步轮询 | 长耗时任务 |
| 流式更新(SSE) | 文本生成场景 |
| 推送通知(Webhook) | 超长任务 |
8.3 同步 RPC vs RocketMQ 异步通信
| 维度 | 同步 RPC | RocketMQ(异步通信) |
|---|---|---|
| 通信模型 | 同步请求-响应(阻塞) | 异步发布-订阅/点对点(非阻塞) |
| 解耦性 | 紧耦合 | 松耦合,通过 Topic 解耦 |
| 可靠性 | 无内置重试/持久化 | 消息持久化 + 自动重试 + 死信队列 |
| 流量削峰 | 无法缓冲,易雪崩 | 消息堆积能力,平滑应对高峰 |
| 事务一致性 | 需外部协调 | 原生支持分布式事务消息 |
| 可观测性 | 依赖链路追踪中间件 | 内置消息轨迹 + 全链路 TraceID 透传 |
| 扩展性 | 需服务发现 + 负载均衡 | 天然支持多消费者组,弹性扩缩容 |
九、LiteTopic:专为 AI 场景设计的轻量级通信
Apache RocketMQ 推出 LiteTopic 通信模型,本质是独立的 Queue,基于百万队列核心技术构建。
9.1 四大核心优势
| 特性 | 说明 |
|---|---|
| 轻量级通信 | 极低的资源动态创建开销,可轻松支持海量会话 |
| 企业级上下文管理 | 以连续消息流保存 Session 上下文,顺序保障 + 排他消费 + 原生支持大消息体 |
| 单节点粒度订阅管理 | 同一 CID 下不同节点可独立订阅不同 LiteTopic,支持运行时动态增减订阅 |
| 断点续传 | 通过 Offset 位点实现故障恢复,无消息丢失、无重复消费 |
9.2 四大 Session 能力
- 会话状态持久化——进程重启不丢会话
- 消息回溯与重放——断点精准恢复
- Session 隔离与路由——多会话并行无干扰
- 流量削峰与缓冲——保护下游应用稳定性
核心价值:将”Session”从内存易失状态转化为可持久、可追溯、可恢复的事件流,为多智能体系统提供企业级会话韧性。
十、AgentScope × RocketMQ:最佳组合实践
阿里巴巴 AgentScope 框架面向多智能体、开发者友好,具备对开发者透明、实时可介入、模型无关、乐高式构建等核心优势。
10.1 集成架构
- 作为服务提供者:内部支持符合 A2A 协议的 JSONRPC WebService 和 RocketMQ Service,通过 well-known 接口暴露 Agent 能力
- 作为服务调用者:通过 A2A 协议定义的 JSONRPCTransport 或 RocketMQTransport 发起请求并解析响应
10.2 典型协作流程(智能旅行助手)
三个 Agent:
- SupervisorAgent(总控):任务分解与逻辑编排
- WeatherAgent(天气专家):查询天气
- TravelAgent(旅行专家):依据天气规划行程
通信链路:
- Supervisor 拆分任务 → 发送至 B/C 的业务 Normal Topic
- B/C 集群拉取处理 → 结果发布到 Supervisor 订阅的 LiteTopic
- Supervisor 拉取 LiteTopic 汇聚响应 → 驱动后续编排
10.3 开箱即用的 A2A 实现
基于 RocketMQ SDK 实现了 A2A 协议的 ClientTransport 接口,支持:
sendMessage:发送普通同步请求sendMessageStreaming:发送 Stream 请求resubscribe:重订订阅任务数据getTask/cancelTask:查询/取消任务
开源地址:
https://github.com/apache/rocketmq-a2a
十一、从 WebMCP 到 AgentOS:协议层到系统层的跃迁
核心判断:WebMCP 与 AgentOS 的关系,并非版本迭代或功能叠加,而是一场从协议层到系统层、从解决”连接问题”到解决”调度与治理问题”的根本性架构跃迁。
| 维度 | WebMCP(协议层) | AgentOS(系统层) |
|---|---|---|
| 核心定位 | 标准化”连接器”(USB-C 接口) | 系统级”调度与治理平台”(操作系统) |
| 解决问题 | ”如何让智能体安全、标准地调用外部能力" | "如何让智能体理解意图、自主规划、协同执行” |
| 管理对象 | 工具、资源、提示词 | LLM 算力、记忆系统、工具网络、Agent 实例 |
| 交互范式 | 应用为中心(被动执行指令) | 意图为中心(主动解决问题) |
| 驱动方式 | 客户端主动”拉取” | 事件主动”推送”(发布-订阅) |
| 类比 | ”AI 时代的 USB-C 接口" | "智能时代的操作系统” |
演进关系总结:MCP 让智能体有了”手”(连接能力),AgentOS 为这些”手”配上了”大脑”(规划调度)和”神经系统”(系统协调)。MCP 被内化至 AgentOS 架构的”执行与工具层”,成为智能体可调度的标准化”系统调用”接口。
WebMCP 的双通道传输架构
| 通道 | 方向 | 作用 | 技术原理 |
|---|---|---|---|
| SSE 通道 | Server → Client | 异步通知、日志、进度推送 | 基于 HTTP/1.1 长连接,Client 发起 GET 请求,Server 通过 data: … 事件流持续推送 |
| HTTP POST 通道 | Client ↔ Server | 协议初始化、工具列表查询、工具调用 | 消息体为 JSON-RPC 2.0 格式 |
四步骤通信生命周期:
- 连(Connect):Client 向 Server 的 SSE 端点发起 GET 请求
- 取(Get Endpoint):Server 立即通过 SSE 流发送 endpoint 事件
- 握(Handshake):发送 initialize 请求 → 响应 → notifications/initialized 通知
- 用(Usability):进入正常工作阶段,调用 tools/list、tools/call
十二、AgentOS 的六层分层架构
| 层级 | 名称 | 核心职责 | 关键技术与组件 |
|---|---|---|---|
| L6 | 基础设施层 | 提供底层计算、存储、网络资源 | Docker 容器化、CPU/GPU/NPU 异构算力、Kafka/Pulsar、向量数据库、PostgreSQL、Redis |
| L5 | 编排与治理层 | 系统的”指挥中心”,协调组件、管理智能体生命周期 | Agno/LangGraph、任务调度器、权限管理、Human-in-the-Loop、MCP/A2A 协议 |
| L4 | 记忆与状态层 | 管理短期上下文、长期知识与任务状态 | 工作记忆、向量数据库、经验库、Redis 状态外部化 |
| L3 | 执行与工具层 | 将决策转化为实际行动 | MCP 工具调用生态、CLI 编排引擎、代码解释器、行动执行器 |
| L2 | 认知与决策层 | 负责任务规划、推理、策略选择 | LLM 内核、CoT/ToT 规划、多智能体协作调度器 |
| L1 | 接口与感知层 | 统一接收并抽象多模态输入 | 多模态输入抽象、意图识别、流式感知管道 |
关键架构机制:
- 多智能体协作架构:通用 Agent(协调者)+ 垂直专业 Agent(执行者)
- 控制平面与执行平面分离:控制平面负责协调与决策;执行平面在沙箱/容器中安全执行
- 事件驱动架构(EDA):各层通过消息队列连接,实现松耦合、异步处理与弹性伸缩
- 状态机与图编排:使用 LangGraph 将工作流定义为包含循环、条件分支的状态图
十三、消息中间件在 Agent 系统中的核心角色
| 角色 | 价值体现 |
|---|---|
| 通信总线 | 提供可靠、可追溯、可扩展的 Agent 间消息传递通道 |
| 状态持久化层 | 将易失的内存 Session 转化为可重放的事件流 |
| 流量调度器 | 削峰填谷,保护下游 GPU 推理资源不被瞬时高并发击穿 |
| 故障恢复基座 | 断点续传、动态订阅重平衡,实现会话级别的无损恢复 |
| 标准协议载体 | 作为 A2A 协议的底层传输,支撑跨厂商/跨框架互操作 |
| 可观测性入口 | 内置消息轨迹 + TraceID,便于多智能体系统的调试与审计 |
十四、企业级实施方法学:三阶段渐进式演进
第一阶段:价值验证(1–3 个月)
- 选点:高重复性、高复杂性、高人工成本场景
- 速建:GPT-4/Claude + LangChain/Dify MVP
- 验证:任务完成率 > 85%
第二阶段:工程深化与试点(3–12 个月)
- 架构升级:LangGraph + CrewAI
- 保障体系:安全护栏、最小权限、成本优化
- 可观测:LangSmith 全链路追踪
- 流程嵌入:CI/CD 流水线
第三阶段:规模化生产与生态集成(12 个月以上)
- 平台化治理:统一 AgentOps 平台
- 生态互联:MCP/A2A 协议全面推广
- 精细化运营:成本分摊、性能 SLA、合规审计
- 文化制度化:设立 AI 治理委员会
十五、可靠性设计的四道防线
| 防线 | 机制 | 适用场景 |
|---|---|---|
| 重试 | 指数退避算法 | 临时性错误(网络抖动、超时) |
| 熔断 | 连续失败率阈值触发 | 下游服务不可用时暂停调用 |
| 降级 | 兜底方案 | 知识检索失败时返回标准答复 |
| 可观测 | 日志 + 链路追踪 + 指标监控 | 实时定位”为什么出问题” |
核心原则:没有稳定性,就没有智能。多 Agent 系统在运行中必然遭遇工具调用失败、网络中断、Agent 宕机——关键是出问题后知道”为什么出问题”。
十六、核心设计哲学
| 维度 | 核心策略 | 解决的核心问题 |
|---|---|---|
| 可恢复性 | 状态可查询 + 结果可恢复 | 进程崩溃后任务不丢失 |
| 可扩展性 | 异步队列 + Worker 池 | 单机资源瓶颈 |
| 可观测性 | trace_id + run_id + job_id 全链路 | 异步链路调试 |
| 可治理性 | 协议标准化 + 多智能体协同 | 跨框架互操作 |
| 可编排性 | DAG + 状态机 | 复杂任务依赖表达 |
一句话总结:Agent 异步架构的本质是事件驱动的任务状态机——Planner 拆解目标,Orchestrator 编排执行,Worker 调用模型和工具,Job Store 保存事实,Event Bus 通知变化,Result Store 保存上下文,前端通过轮询/SSE/WebSocket 感知进度。
十七、给生产团队的 Checklist
设计 Agent 异步架构时的自检清单:
-
状态机是否定义了 Run 和 Job 两层?
-
是否采用”先写结果再发事件”的可靠性顺序?
-
是否使用事务 outbox 保证强一致性?
-
事件是否携带 event_id + version 以支持幂等?
-
是否使用租约机制防止 worker 宕机后任务卡死?
-
通知机制是否同时提供轮询和推送两种能力?
-
trace_id + run_id + job_id 是否贯穿全链路?
-
多 Agent 通信是否采用 A2A 协议?
-
工具调用是否采用 MCP 协议?
-
是否选择了合适的消息中间件(Kafka/RocketMQ/NATS)?
-
失败恢复路径是否经过端到端测试?
-
监控告警是否覆盖 queued 堆积、dead_lettered、worker 心跳超时?
参考阅读
今日笔记综合自以下 5 篇文章:
- 《Agent 异步架构原理》 — 七类核心组件、Run/Job 状态机、五项设计原则
- 《揭秘多 Agent 系统的”操作系统”》 — 任务调度、通信协议、可靠性设计
- 《企业级多 Agent 系统架构、协作机制与实施方法学》 — 架构范式、A2A/MCP 协议、三阶段实施
- 《AgentScope × RocketMQ:A2A 智能体通信基座》 — LiteTopic 模型、A2A 通道、最佳实践
- 《从 WebMCP 到 AgentOS:架构、通信与资源调度》 — 协议层到系统层演进、六层分层架构
写给未来的自己:Agent 异步架构不是”加一个消息队列”,而是”重新思考任务如何被表达、调度、执行、恢复”——把状态机、事件流、租约、幂等这些分布式系统的基础原则,与 LLM 的概率性、不确定性、长耗时特性结合起来,才能让 Agent 从”能跑”走向”能稳定跑”。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













