<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>分布式系统 on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Tue, 04 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>多Agent 系统架构设计（一）：四种编排模式，从 Flink JobManager 到 Kafka Consumer Group</title>
        <link>https://www.yesmiracle.net/post/20260804-multi-agent-orchestration-patterns/</link>
        <pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260804-multi-agent-orchestration-patterns/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260804-multi-agent-orchestration-patterns/cover.svg" alt="Featured image of post 多Agent 系统架构设计（一）：四种编排模式，从 Flink JobManager 到 Kafka Consumer Group" /&gt;&lt;p&gt;如果你正在搭建一个多 Agent 系统，你很快就会遇到一个灵魂拷问：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这些 Agent 之间到底怎么「配合」？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;是把一个「总指挥」Agent 放在中间，让它分派任务？还是让所有 Agent 平等对话，谁有空谁干？或者搞一个「监工」Agent 来监督一群干活 Agent？再或者让 Agent 排成一条流水线，一个接一个处理？&lt;/p&gt;
&lt;p&gt;答案是：&lt;strong&gt;看你的场景。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但问题在于，大多数人做选择时靠的是「直觉」——哪个模式听起来更酷就用哪个。结果就是：系统上线后，状态不一致、任务重复执行、Agent 互相死锁……然后花几周来重构。&lt;/p&gt;
&lt;p&gt;这篇文章是《多Agent 系统架构设计》系列的第一篇。我打算从&lt;strong&gt;分布式系统工程&lt;/strong&gt;的角度，把四种基本的编排模式讲透。每种模式的拓扑结构、适用场景、状态管理策略、容错设计，以及——作为一个做了十几年 Flink/Kafka/Pulsar 的人——我会用你熟悉的分布式系统概念来类比。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你还没看过我之前写的 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/20260726-agent-to-agent-protocol-guide/&#34; &gt;Agents 互联！A2A/MCP/ANP/ACP 四大协议详解&lt;/a&gt;，建议先读那篇。编排模式决定了你要用什么样的通信协议，两者是「上层拓扑」和「下层连接」的关系。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;为什么编排模式是架构设计的第一性原理&#34;&gt;为什么编排模式是架构设计的「第一性原理」？&lt;/h2&gt;
&lt;p&gt;在聊具体模式之前，先想清楚一个问题：&lt;strong&gt;为什么需要编排？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;单 Agent 的架构很简单：一个 LLM 循环（感知 → 规划 → 行动 → 观察），调几个工具，完成任务。所有状态都在一个进程里，不存在协调问题。&lt;/p&gt;
&lt;p&gt;但当你把 N 个 Agent 放在一起时，就出现了三个新问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;任务怎么分&lt;/strong&gt;：谁来决定哪个 Agent 做什么？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态怎么管&lt;/strong&gt;：Agent A 的执行结果怎么影响 Agent B 的决策？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错了怎么办&lt;/strong&gt;：Agent C 挂了，谁负责重新调度？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这三个问题，就是编排模式要回答的。不同的编排模式，本质上是&lt;strong&gt;控制权的分配方式不同&lt;/strong&gt;——是把控制权集中在一个中心节点，还是分散到所有 Agent 中。&lt;/p&gt;
&lt;h2 id=&#34;四种编排模式速览&#34;&gt;四种编排模式速览&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;Orchestrator-Worker&lt;/th&gt;
          &lt;th&gt;Peer-to-Peer&lt;/th&gt;
          &lt;th&gt;Supervisor&lt;/th&gt;
          &lt;th&gt;Chain&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;控制权&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;集中（中心调度）&lt;/td&gt;
          &lt;td&gt;分散（平等协商）&lt;/td&gt;
          &lt;td&gt;分层（监督者）&lt;/td&gt;
          &lt;td&gt;线性（前驱驱动）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;通信拓扑&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;星型&lt;/td&gt;
          &lt;td&gt;网状&lt;/td&gt;
          &lt;td&gt;树型&lt;/td&gt;
          &lt;td&gt;链式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;状态管理&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;中心化&lt;/td&gt;
          &lt;td&gt;分布式&lt;/td&gt;
          &lt;td&gt;分层&lt;/td&gt;
          &lt;td&gt;隐式传递&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;容错策略&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;重新调度 Worker&lt;/td&gt;
          &lt;td&gt;冗余 + Gossip&lt;/td&gt;
          &lt;td&gt;监督者重启&lt;/td&gt;
          &lt;td&gt;重试 + 补偿&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;扩展性&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;中（中心瓶颈）&lt;/td&gt;
          &lt;td&gt;高（无单点）&lt;/td&gt;
          &lt;td&gt;高（水平扩展）&lt;/td&gt;
          &lt;td&gt;中（链长限制）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;调试难度&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
          &lt;td&gt;高&lt;/td&gt;
          &lt;td&gt;中&lt;/td&gt;
          &lt;td&gt;中&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;典型类比&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Flink JobManager&lt;/td&gt;
          &lt;td&gt;Kafka Consumer Group&lt;/td&gt;
          &lt;td&gt;Kubernetes ReplicaSet&lt;/td&gt;
          &lt;td&gt;数据管道&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;模式一orchestrator-worker--当你有总指挥&#34;&gt;模式一：Orchestrator-Worker — 当你有「总指挥」&lt;/h2&gt;
&lt;h3 id=&#34;拓扑结构&#34;&gt;拓扑结构&lt;/h3&gt;
&lt;p&gt;这是最直观的模式：一个中心 Orchestrator Agent 负责任务分解、调度、结果聚合；一群 Worker Agent 负责执行具体任务。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;         ┌─────────────────────┐
         │   Orchestrator      │
         │   (任务分解 + 调度)   │
         └──────────┬──────────┘
                    │
      ┌─────────────┼─────────────┐
      │             │             │
   ┌──▼──┐      ┌──▼──┐      ┌──▼──┐
   │Worker│      │Worker│      │Worker│
   │  A   │      │  B   │      │  C   │
   └──────┘      └──────┘      └──────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;核心设计理念&#34;&gt;核心设计理念&lt;/h3&gt;
&lt;p&gt;Orchestrator 是大脑，Worker 是手脚。Orchestrator 维护全局状态视图，Worker 只做执行，不做决策。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你做过 Flink，这其实就是 JobManager → TaskManager 的映射。&lt;/strong&gt; JobManager 负责 Checkpoint 协调、任务分片、故障恢复；TaskManager 只管执行算子。Orchestrator-Worker 的本质就是把「决策」和「执行」分离。&lt;/p&gt;
&lt;h3 id=&#34;状态管理策略&#34;&gt;状态管理策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中心化状态&lt;/strong&gt;：Orchestrator 维护任务队列、Worker 心跳、执行结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker 无状态&lt;/strong&gt;：Worker 不持久化任何状态，全量依赖 Orchestrator 下发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同步模式&lt;/strong&gt;：Orchestrator 等 Worker 返回结果后再做下一步决策&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;容错设计&#34;&gt;容错设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Worker 挂了 → Orchestrator 检测心跳超时，把任务重新分配给另一个 Worker（类似 Flink 的 Task Failover）&lt;/li&gt;
&lt;li&gt;Orchestrator 挂了 → 系统整体不可用，需要 Orchestrator 自身做 HA（主备或 Raft 共识）&lt;/li&gt;
&lt;li&gt;推荐做法：Orchestrator 用 etcd/ZooKeeper 做选主，Worker 用注册中心做服务发现&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;适用场景&#34;&gt;适用场景&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;任务可分解为独立子任务&lt;/strong&gt;：比如并行做 N 个文档分析，每个 Worker 处理一篇
✅ &lt;strong&gt;需要全局可见性&lt;/strong&gt;：比如做竞品分析，Orchestrator 需要知道所有 Worker 的结果才能合成最终报告
✅ &lt;strong&gt;子任务之间没有依赖&lt;/strong&gt;：Worker A 不需要等 Worker B 的结果&lt;/p&gt;
&lt;h3 id=&#34;不适用场景&#34;&gt;不适用场景&lt;/h3&gt;
&lt;p&gt;❌ 子任务之间有复杂的依赖关系（需要 Chain 或 DAG）
❌ Worker 数量超过百级（Orchestrator 会成为瓶颈）
❌ 需要低延迟的实时协作（中心调度增加了转发延迟）&lt;/p&gt;
&lt;h3 id=&#34;真实案例&#34;&gt;真实案例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CrewAI&lt;/strong&gt; 的 SequentialProcess / HierarchicalProcess 模式本质上就是 Orchestrator-Worker&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LangGraph&lt;/strong&gt; 的 &lt;code&gt;StateGraph&lt;/code&gt; 中，你可以把编译后的图执行器看作一个轻量 Orchestrator&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI 的 Assistants API&lt;/strong&gt; 中，Thread + Run 的模型也是 Orchestrator-Worker 的变体&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;模式二peer-to-peer--当agent们平等对话&#34;&gt;模式二：Peer-to-Peer — 当Agent们「平等对话」&lt;/h2&gt;
&lt;h3 id=&#34;拓扑结构-1&#34;&gt;拓扑结构&lt;/h3&gt;
&lt;p&gt;没有中心节点，所有 Agent 都可以互相通信。每个 Agent 既是生产者也是消费者，通过 Gossip 协议或共享消息总线来协调。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;         ┌──────┐
    ┌────│Agent │◄────┐
    │    │  A   │     │
    │    └──────┘     │
    │                  │
 ┌──▼──┐          ┌──▼──┐
 │Agent│◄────────►│Agent│
 │  B   │          │  C   │
 └──────┘          └──────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;核心设计理念-1&#34;&gt;核心设计理念&lt;/h3&gt;
&lt;p&gt;没有「总指挥」，所有 Agent 通过协商或竞争来完成任务。每个 Agent 有自己的局部视图，通过消息交换来达成全局一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;做过 Kafka Consumer Group 的话，你会觉得这个模式很熟悉。&lt;/strong&gt; 同一个 Group 下的 Consumer 通过协调器分配 Partition，每个 Consumer 各自消费，没有中心调度器告诉它们「你去读 Partition 0，你去读 Partition 1」。靠的是&lt;strong&gt;协议&lt;/strong&gt;（比如 Kafka 的 rebalance 协议）而不是&lt;strong&gt;命令&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;状态管理策略-1&#34;&gt;状态管理策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分布式状态&lt;/strong&gt;：每个 Agent 维护自己的局部状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终一致性&lt;/strong&gt;：通过 Gossip 或消息传递来同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步模式&lt;/strong&gt;：Agent 之间不互相等待，通过事件驱动&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;容错设计-1&#34;&gt;容错设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;单个 Agent 挂了 → 其他 Agent 通过 Gossip / 心跳检测到，任务被其他 Agent 捡起&lt;/li&gt;
&lt;li&gt;网络分区 → 每个分区独立运行，恢复后做状态合并（类似 CRDT 思路）&lt;/li&gt;
&lt;li&gt;没有单点故障，但可能出现「脑裂」——两个 Agent 同时认为自己在负责同一个任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;适用场景-1&#34;&gt;适用场景&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Agent 之间需要灵活协作&lt;/strong&gt;：谁有空谁接任务，不需要提前分配
✅ &lt;strong&gt;系统规模大、动态变化&lt;/strong&gt;：Agent 可以随时加入或退出
✅ &lt;strong&gt;低延迟、高可用&lt;/strong&gt;：没有中心瓶颈，任一 Agent 挂了不影响整体&lt;/p&gt;
&lt;h3 id=&#34;不适用场景-1&#34;&gt;不适用场景&lt;/h3&gt;
&lt;p&gt;❌ 需要严格的事务一致性（分布式事务在 P2P 下非常难做）
❌ 调试和审计需求高（消息流向不固定，难以追踪）
❌ 子任务之间有严格的依赖顺序&lt;/p&gt;
&lt;h3 id=&#34;真实案例-1&#34;&gt;真实案例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CrewAI&lt;/strong&gt; 的 &lt;code&gt;Process.sequential&lt;/code&gt; 其实不算 P2P，但它的「可选 Agent 投票」机制接近 P2P 协商&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoGen&lt;/strong&gt; 的 GroupChat 模式：多个 Agent 围绕一个话题讨论，谁拿到发言权谁说话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka 流处理&lt;/strong&gt;中，多个 Processor 节点通过内部 Topic 交换数据，本质上是 P2P 消息传递&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;模式三supervisor--当你要分层管理&#34;&gt;模式三：Supervisor — 当你要「分层管理」&lt;/h2&gt;
&lt;h3 id=&#34;拓扑结构-2&#34;&gt;拓扑结构&lt;/h3&gt;
&lt;p&gt;一种介于集中和分散之间的模式：Supervisor Agent 不直接做事，而是管理一组 Worker Agent，并且 Supervisor 之间可以形成层级结构。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;         ┌──────────────┐
         │  Top Supervisor│
         └──────┬───────┘
                │
      ┌─────────┼─────────┐
      │         │         │
   ┌──▼──┐  ┌──▼──┐  ┌──▼──┐
   │Supv │  │Supv │  │Supv │
   │  A  │  │  B  │  │  C  │
   └──┬──┘  └──┬──┘  └──┬──┘
      │        │        │
   ┌──┼──┐  ┌──┼──┐  ┌──┼──┐
   │  │  │  │  │  │  │  │  │
   W1 W2 W3 W4 W5 W6 W7 W8 W9
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;核心设计理念-2&#34;&gt;核心设计理念&lt;/h3&gt;
&lt;p&gt;Supervisor 的职责不是「做任务」，而是「管 Agent」。它监控 Worker 的健康状态、重启失败的 Worker、上报汇总信息给上层 Supervisor。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你用过 Kubernetes，这其实就是 ReplicaSet → Pod 的映射。&lt;/strong&gt; ReplicaSet 不跑业务代码，它只确保有 N 个 Pod 在跑。Pod 挂了它重新拉起。Supervisor 模式的核心思想就是&lt;strong&gt;分层管理、职责分离&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;状态管理策略-2&#34;&gt;状态管理策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分层状态&lt;/strong&gt;：每层 Supervisor 维护自己管辖范围内的聚合状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态上卷&lt;/strong&gt;：下层 Supervisor 定期向上层汇报摘要（心跳 + 统计指标）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令下发&lt;/strong&gt;：上层 Supervisor 向下传递策略配置（不传具体任务）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;容错设计-2&#34;&gt;容错设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Worker 挂了 → 直接 Supervisor 重启或替换，对上层透明&lt;/li&gt;
&lt;li&gt;Supervisor 挂了 → 下层 Supervisor 或 Worker 进入「降级模式」，等待恢复&lt;/li&gt;
&lt;li&gt;顶级 Supervisor 挂了 → 需要 HA 保障（主备或共识算法）&lt;/li&gt;
&lt;li&gt;容错隔离性是最大优势：一个 Worker 挂了不影响其他 Worker&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;适用场景-2&#34;&gt;适用场景&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;系统规模大，需要分层管理&lt;/strong&gt;：比如 100+ Agent 的系统，不可能一个 Orchestrator 管所有
✅ &lt;strong&gt;不同 Worker 类型差异大&lt;/strong&gt;：不同类型的 Worker 需要不同的管理策略
✅ &lt;strong&gt;需要审计和治理&lt;/strong&gt;：每层 Supervisor 可以记录日志和决策&lt;/p&gt;
&lt;h3 id=&#34;不适用场景-2&#34;&gt;不适用场景&lt;/h3&gt;
&lt;p&gt;❌ 系统规模小（&amp;lt; 10 Agent），分层管理引入不必要的复杂度
❌ 任务需要快速跨层协作（跨 Supervisor 的通信延迟高）
❌ 需要全局一致性视图（分层意味着信息延迟）&lt;/p&gt;
&lt;h3 id=&#34;真实案例-2&#34;&gt;真实案例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pulsar&lt;/strong&gt; 的分层架构：BookKeeper 中的 Auditor（审计节点）负责监控 Bookie 的健康状态，和 Supervisor 模式异曲同工&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LangGraph&lt;/strong&gt; 的自定义 Checkpoint + 中断恢复机制，可以理解为一种 Supervisor 式的容错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Operator&lt;/strong&gt; 模式：Operator 作为 Supervisor 监控自定义资源的状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;模式四chain--当agent们排成流水线&#34;&gt;模式四：Chain — 当Agent们「排成流水线」&lt;/h2&gt;
&lt;h3 id=&#34;拓扑结构-3&#34;&gt;拓扑结构&lt;/h3&gt;
&lt;p&gt;Agent 按顺序排列，前一个 Agent 的输出作为后一个 Agent 的输入。数据像流水线一样流过各个处理节点。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐
  │Agent │──►│Agent │──►│Agent │──►│Agent │
  │  A   │    │  B   │    │  C   │    │  D   │
  └──────┘    └──────┘    └──────┘    └──────┘
  输入         处理         处理         输出
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;核心设计理念-3&#34;&gt;核心设计理念&lt;/h3&gt;
&lt;p&gt;每个 Agent 只做一件事，做完传给下一个。数据流的方向是固定的，不存在回环或并行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;做过数据管道（Flink DataStream / Kafka Streams）的话，你对这个模式再熟悉不过了。&lt;/strong&gt; 一个 Source Operator → 三个 Transformation → 一个 Sink Operator，数据按确定性顺序流过每个算子。Chain 模式就是把这个思路搬到 Agent 世界。&lt;/p&gt;
&lt;h3 id=&#34;状态管理策略-3&#34;&gt;状态管理策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐式传递&lt;/strong&gt;：状态随数据流自然传递，不单独维护&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无共享状态&lt;/strong&gt;：每个 Agent 只处理当前输入，不需要访问其他 Agent 的状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同步/异步混合&lt;/strong&gt;：可以同步处理（等前一个 Agent 完成），也可以在 Agent 之间加队列做异步缓冲&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;容错设计-3&#34;&gt;容错设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;单个 Agent 挂了 → 从上游重放数据（类似 Flink 的 Checkpoint）&lt;/li&gt;
&lt;li&gt;链中某个 Agent 处理失败 → 重试或进入补偿流程&lt;/li&gt;
&lt;li&gt;整体吞吐受限于最慢的 Agent（瓶颈效应）&lt;/li&gt;
&lt;li&gt;可以用 Kafka/Pulsar Topic 做 Agent 间的缓冲队列，解耦生产和消费速率&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;适用场景-3&#34;&gt;适用场景&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;处理流程是确定性的&lt;/strong&gt;：数据清洗 → 特征提取 → 分类 → 输出
✅ &lt;strong&gt;每个步骤有明确输入输出&lt;/strong&gt;：步骤之间耦合度低
✅ &lt;strong&gt;需要审计和可追溯性&lt;/strong&gt;：每条数据经过的 Agent 路径是固定的&lt;/p&gt;
&lt;h3 id=&#34;不适用场景-3&#34;&gt;不适用场景&lt;/h3&gt;
&lt;p&gt;❌ 需要并行处理（Chain 本质是串行的）
❌ 需要 Agent 之间双向通信（Chain 是单向的）
❌ 链太长（超过 10 个 Agent）会导致延迟累积&lt;/p&gt;
&lt;h3 id=&#34;真实案例-3&#34;&gt;真实案例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大多数 RAG Pipeline&lt;/strong&gt;：Query Agent → Retrieval Agent → Rerank Agent → Generation Agent，就是标准的 Chain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业审批流程&lt;/strong&gt;：创建 Agent → 审批 Agent → 执行 Agent → 通知 Agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flink DataStream&lt;/strong&gt; 的直接映射：Source → Map → Filter → Sink&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;实战场景四种模式怎么选&#34;&gt;实战场景：四种模式怎么选？&lt;/h2&gt;
&lt;p&gt;场景化选择比理论更重要。来看几个真实场景，看看每种模式怎么落地。&lt;/p&gt;
&lt;h3 id=&#34;场景一智能客服系统&#34;&gt;场景一：智能客服系统&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;需求&lt;/th&gt;
          &lt;th&gt;选型&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;用户提问后，需要查知识库、查订单、查物流&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Orchestrator-Worker&lt;/strong&gt;：一个 Orchestrator 接收用户问题，分解为三个子任务，并行派发给三个 Worker，汇总结果后回复&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;如果某个查询失败（如订单系统超时）&lt;/td&gt;
          &lt;td&gt;Orchestrator 可以重试或跳过，不影响其他两个 Worker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;用户追问「那物流到了吗？」&lt;/td&gt;
          &lt;td&gt;Orchestrator 维护会话上下文，直接把问题路由到物流 Worker&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;场景二代码审查系统&#34;&gt;场景二：代码审查系统&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;需求&lt;/th&gt;
          &lt;th&gt;选型&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;提交 PR 后，依次做：静态分析 → 安全扫描 → 单元测试 → 生成审查报告&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Chain&lt;/strong&gt;：四个 Agent 排成流水线，每个只做一件事&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;安全扫描发现了高危漏洞&lt;/td&gt;
          &lt;td&gt;可以在 Chain 中插入一个「门禁 Agent」：如果安全扫描不通过，直接打回，不进入后续步骤&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;需要并行跑多个的安全扫描器&lt;/td&gt;
          &lt;td&gt;用 Orchestrator-Worker 替代 Chain 的某个环节，在安全扫描阶段并发跑多个工具&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;场景三企业-agent-部署管理&#34;&gt;场景三：企业 Agent 部署管理&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;需求&lt;/th&gt;
          &lt;th&gt;选型&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;管理 100+ Agent，每个 Agent 负责一个业务域&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Supervisor&lt;/strong&gt;：按业务域分层，每个域的 Supervisor 管理 10-15 个 Agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;需要灰度发布新版本&lt;/td&gt;
          &lt;td&gt;Supervisor 可以控制自己管辖范围内的 Agent 逐步升级&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;某一层 Supervisor 挂了&lt;/td&gt;
          &lt;td&gt;下层 Worker 降级运行，不丢失状态&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;场景四多-agent-协作研究&#34;&gt;场景四：多 Agent 协作研究&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;需求&lt;/th&gt;
          &lt;th&gt;选型&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;多个 Agent 自由讨论一个技术问题&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Peer-to-Peer&lt;/strong&gt;：没有中心调度，Agent 自由发言，通过投票或共识达成结论&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;讨论陷入僵局&lt;/td&gt;
          &lt;td&gt;引入一个「仲裁者 Agent」作为临时 Orchestrator，打破僵局后退出&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;混合模式现实世界的常态&#34;&gt;混合模式：现实世界的常态&lt;/h2&gt;
&lt;p&gt;在实际系统中，你很少会只用一种模式。&lt;strong&gt;大多数生产系统是混合的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如一个真实的电商 Agent 系统：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;                    ┌──────────────────────┐
                    │   Orchestrator       │ (主入口)
                    │   (用户意图识别)      │
                    └──────────┬───────────┘
                               │
          ┌────────────────────┼────────────────────┐
          │                    │                    │
     ┌────▼────┐        ┌────▼────┐         ┌────▼────┐
     │ 搜索    │        │ 下单    │         │ 售后    │
     │ Supervisor│       │ Chain   │         │ P2P    │
     │ (管3个搜索│       │(检→付→发)│         │(多客服)  │
     │  Agent)  │        │         │         │         │
     └──────────┘        └─────────┘         └─────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;入口层&lt;/strong&gt;：Orchestrator-Worker，由 Orchestrator 判断用户意图，路由到对应子系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;搜索域&lt;/strong&gt;：Supervisor 管理多个搜索 Agent（商品搜索、价格比较、库存查询）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下单域&lt;/strong&gt;：Chain 模式（下单检查 → 支付 → 发货通知）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;售后域&lt;/strong&gt;：Peer-to-Peer，多个客服 Agent 自由接单&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是多 Agent 系统的真实面貌——&lt;strong&gt;不是选一种模式，而是用组合拳。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;选择指南一张决策树&#34;&gt;选择指南：一张决策树&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;需要全局可见性 + 顺序控制？
├── 是 → 子任务可并行？
│   ├── 是 → Orchestrator-Worker
│   └── 否 → 子任务有严格顺序？
│       ├── 是 → Chain
│       └── 否 → 需要混合
└── 否 → 系统规模 &amp;gt; 50 Agent？
    ├── 是 → Supervisor（分层管理）
    └── 否 → Agent 需要自由协作？
        ├── 是 → Peer-to-Peer
        └── 否 → Supervisor 或混合
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;这篇文章我们从分布式系统工程的角度，拆解了四种基本的编排模式。每种模式都不是银弹，但理解它们的设计哲学——控制权如何分配、状态如何管理、错误如何恢复——能帮你在面对具体的多 Agent 系统设计时，做出有依据的选择，而不是靠直觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下一篇预告：通信层 — Agent 之间到底怎么「说话」？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你确定了编排模式后，下一个问题就是：Agent 之间用什么协议？MCP 和 A2A 在架构中的角色是什么？同步 vs 异步怎么选？事件总线是否必要？&lt;/p&gt;
&lt;p&gt;我会在第二篇中，从你的 MCPZERO 网关经验出发，讲清楚 Agent 通信层的架构设计。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 本系列连载：
一、编排模式 — 四种基本拓扑（本篇）
二、通信层 — Agent 通信架构选择
三、演进路径 — 从单 Agent 到多 Agent
四、未来范式 — Agent 即服务与 Agent Mesh&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        
    </channel>
</rss>
