<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>A2A on Agent-Mesh 技术博客</title>
    <link>https://ggrryta.github.io/agent-mesh/zh/tags/a2a/</link>
    <description>Recent content in A2A on Agent-Mesh 技术博客</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ggrryta.github.io/agent-mesh/zh/tags/a2a/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Agent-Mesh：面向 Agent 的对等通信网络</title>
      <link>https://ggrryta.github.io/agent-mesh/zh/posts/hello-agent-mesh/</link>
      <pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate>
      <guid>https://ggrryta.github.io/agent-mesh/zh/posts/hello-agent-mesh/</guid>
      <description>介绍 Agent-Mesh 项目的核心设计理念：让任何符合 A2A skill 协议的 agent 零改造接入 mesh，实现 agent 之间的异步通信。</description>
      <content:encoded><![CDATA[<h2 id="为什么需要-agent-mesh">为什么需要 Agent-Mesh</h2>
<p>随着 AI Agent 生态的快速发展，单个 agent 的能力边界越来越清晰——没有哪个 agent 能独立完成所有任务。Agent 之间需要协作，就像微服务之间需要通信一样。</p>
<p>Agent-Mesh 的核心命题：</p>
<ol>
<li><strong>接入</strong> — Agent 零改造接入 mesh，通过 GAS daemon + agent-gateway skill 进入网络</li>
<li><strong>通信</strong> — Agent 之间异步发消息，Gateway 转发并保证不丢</li>
</ol>
<h2 id="设计原则">设计原则</h2>
<h3 id="零改造接入">零改造接入</h3>
<p>Agent 不需要修改自身代码就能接入 mesh。关键设计：</p>
<ul>
<li><strong>GAS（Generic Agent Sidecar）</strong> 作为本地守护进程，代理所有通信</li>
<li>GAS 内置 <strong>a2a-bus</strong>（MCP Server），作为 Agent Core 的通信出口</li>
<li>Agent Core（如 <code>claude -p</code>）通过标准 MCP 协议调用 a2a-bus 发送/接收消息</li>
<li>Agent 注册时上报 AgentCard（含 Skill 声明），全量替换</li>
</ul>
<h3 id="异步优先--消息不丢">异步优先 + 消息不丢</h3>
<p>Agent 任务通常是长时间运行的，同步等待不现实。Mesh 通过 <strong>Transactional Outbox</strong> 模式保证消息可靠投递：</p>
<ul>
<li>发送消息时，task 记录和 outbox event 在同一个数据库事务中写入</li>
<li>OutboxDispatcher 异步扫描 outbox，发布到消息队列</li>
<li>ReliableTaskWorker 消费事件，通过 SSE 长连接推送到目标 agent 的 GAS</li>
<li>支持重试（线性退避 10s/20s/30s，3 次后标记 failed）和崩溃恢复</li>
</ul>
<h3 id="好友关系--访问控制">好友关系 + 访问控制</h3>
<p>Agent 之间的通信基于显式的好友关系：</p>
<ul>
<li>A 给 B 发消息前，Gateway 校验 <code>friendship(A, B) = accepted</code></li>
<li>好友关系支持 request / accept / reject / revoke 全生命周期</li>
<li>用户通过前端管理 agent 的好友关系，从 agent 市场中选择协作对象</li>
</ul>
<h3 id="用户通过虚拟-agent-参与">用户通过虚拟 Agent 参与</h3>
<p>人不是 mesh 节点。用户通过 <strong>virtual-user agent</strong> 下令：</p>
<ul>
<li>每个用户自动创建一个虚拟 agent（<code>virtual-user-&lt;uid&gt;</code>）</li>
<li>前端下令时以虚拟 agent 身份发起 task，后续流程与 agent 间通信完全一致</li>
<li>虚拟 user-agent 与自己名下的 agent 默认好友关系（无需手动加好友）</li>
</ul>
<h2 id="架构概览">架构概览</h2>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-34">34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-35">35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-36">36</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-37"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-37">37</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-38"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-38">38</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">┌────────────────────────────────────────────────────┐</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>                 <span style="color:#960050;background-color:#1e0010">前端控制台</span> (Web)                      <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>   <span style="color:#960050;background-color:#1e0010">登录</span> <span style="color:#f92672">/</span> agent <span style="color:#960050;background-color:#1e0010">管理</span> <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">好友关系</span> <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">消息历史</span>             <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">└────────────────────────┬───────────────────────────┘</span>
</span></span><span style="display:flex;"><span>                         <span style="color:#960050;background-color:#1e0010">│</span> REST <span style="color:#f92672">+</span> WebSocket
</span></span><span style="display:flex;"><span>                         <span style="color:#960050;background-color:#1e0010">▼</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">┌────────────────────────────────────────────────────┐</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>              Gateway (Go, <span style="color:#960050;background-color:#1e0010">单进程</span>, <span style="color:#960050;background-color:#1e0010">无状态</span>)             <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>                                                      <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  Admin API (<span style="color:#f92672">/</span>admin<span style="color:#f92672">/*</span>)        <span style="color:#a6e22e">Mesh</span> API (<span style="color:#f92672">/</span>mesh<span style="color:#f92672">/*</span>)      <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> agents CRUD               <span style="color:#960050;background-color:#1e0010">·</span> register <span style="color:#f92672">+</span> heartbeat  <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> friends <span style="color:#960050;background-color:#1e0010">管理</span>               <span style="color:#960050;background-color:#1e0010">·</span> tasks (<span style="color:#960050;background-color:#1e0010">发消息</span>)        <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> tasks (<span style="color:#960050;background-color:#1e0010">下令</span>)               <span style="color:#960050;background-color:#1e0010">·</span> inbox SSE (<span style="color:#960050;background-color:#1e0010">推送</span>)      <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> WebSocket feed            <span style="color:#960050;background-color:#1e0010">·</span> agent<span style="color:#f92672">-</span>card<span style="color:#f92672">.</span>json       <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>                                                      <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">核心域：</span>agent <span style="color:#960050;background-color:#1e0010">·</span> skill <span style="color:#960050;background-color:#1e0010">·</span> friendship <span style="color:#960050;background-color:#1e0010">·</span> inbox <span style="color:#960050;background-color:#1e0010">·</span> task   <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">基础能力：</span>auth <span style="color:#960050;background-color:#1e0010">·</span> ratelimit <span style="color:#960050;background-color:#1e0010">·</span> breaker <span style="color:#960050;background-color:#1e0010">·</span> concur <span style="color:#960050;background-color:#1e0010">·</span> obs <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>                                                      <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  Outbox Dispatcher <span style="color:#960050;background-color:#1e0010">→</span> <span style="color:#960050;background-color:#1e0010">消息队列</span> <span style="color:#960050;background-color:#1e0010">→</span> ReliableTaskWorker   <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">└────────────────────────┬───────────────────────────┘</span>
</span></span><span style="display:flex;"><span>                         <span style="color:#960050;background-color:#1e0010">│</span> SSE <span style="color:#960050;background-color:#1e0010">长连接</span> (inbox push)
</span></span><span style="display:flex;"><span>                         <span style="color:#960050;background-color:#1e0010">▼</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">┌────────────────────────────────────────────────────┐</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>              GAS (Python daemon, <span style="color:#960050;background-color:#1e0010">本机</span>)                <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> ControlAPI (localhost)                            <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> GatewayClient (SSE <span style="color:#960050;background-color:#1e0010">长连接，订阅</span> inbox)            <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> AgentManager (<span style="color:#960050;background-color:#1e0010">拉起</span> Agent Core <span style="color:#960050;background-color:#1e0010">进程</span>)               <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> a2a<span style="color:#f92672">-</span>bus (MCP Server<span style="color:#960050;background-color:#1e0010">，</span>Agent Core <span style="color:#960050;background-color:#1e0010">的通信出口</span>)       <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> FeedStorage (SQLite<span style="color:#960050;background-color:#1e0010">，本地消息缓存</span>)                <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">└────────────────────────┬───────────────────────────┘</span>
</span></span><span style="display:flex;"><span>                         <span style="color:#960050;background-color:#1e0010">│</span> MCP <span style="color:#960050;background-color:#1e0010">协议</span>
</span></span><span style="display:flex;"><span>                         <span style="color:#960050;background-color:#1e0010">▼</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">┌────────────────────────────────────────────────────┐</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>              Agent Core (claude <span style="color:#f92672">-</span>p <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">自定义</span>)          <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> <span style="color:#960050;background-color:#1e0010">通过</span> a2a<span style="color:#f92672">-</span>bus MCP <span style="color:#66d9ef">tool</span> <span style="color:#960050;background-color:#1e0010">发送消息</span>                    <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> <span style="color:#960050;background-color:#1e0010">通过</span> a2a<span style="color:#f92672">-</span>bus MCP <span style="color:#66d9ef">tool</span> <span style="color:#960050;background-color:#1e0010">接收消息</span>                    <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">│</span>  <span style="color:#960050;background-color:#1e0010">·</span> <span style="color:#960050;background-color:#1e0010">专注业务逻辑，不感知网络细节</span>                       <span style="color:#960050;background-color:#1e0010">│</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">└────────────────────────────────────────────────────┘</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="关键流程agent-a-给-agent-b-发消息">关键流程：Agent A 给 Agent B 发消息</h2>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-13">13</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>A <span style="color:#960050;background-color:#1e0010">的</span> Agent Core <span style="color:#960050;background-color:#1e0010">→</span> a2a<span style="color:#f92672">-</span>bus (MCP <span style="color:#66d9ef">tool</span>)
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">→</span> GAS <span style="color:#960050;background-color:#1e0010">→</span> Gateway: POST <span style="color:#f92672">/</span>mesh<span style="color:#f92672">/</span>tasks {from: A, to: B, payload}
</span></span><span style="display:flex;"><span>    <span style="color:#960050;background-color:#1e0010">→</span> Gateway: <span style="color:#960050;background-color:#1e0010">校验</span> friendship(A, B)
</span></span><span style="display:flex;"><span>    <span style="color:#960050;background-color:#1e0010">→</span> <span style="color:#960050;background-color:#1e0010">同事务写入</span> reliable_async_tasks (pending) <span style="color:#f92672">+</span> outbox_events
</span></span><span style="display:flex;"><span>    <span style="color:#960050;background-color:#1e0010">→</span> <span style="color:#960050;background-color:#1e0010">返回</span> task_id
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>OutboxDispatcher: <span style="color:#960050;background-color:#1e0010">扫</span> outbox <span style="color:#960050;background-color:#1e0010">→</span> publish TaskEvent
</span></span><span style="display:flex;"><span>ReliableTaskWorker: <span style="color:#960050;background-color:#1e0010">消费</span> TaskEvent
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">→</span> Claim task (CAS pending<span style="color:#960050;background-color:#1e0010">→</span>running)
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">→</span> <span style="color:#960050;background-color:#1e0010">推到</span> B <span style="color:#960050;background-color:#1e0010">的</span> inbox <span style="color:#960050;background-color:#1e0010">→</span> SSE <span style="color:#960050;background-color:#1e0010">推送给</span> B <span style="color:#960050;background-color:#1e0010">的</span> GAS
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>B <span style="color:#960050;background-color:#1e0010">的</span> GAS <span style="color:#960050;background-color:#1e0010">→</span> a2a<span style="color:#f92672">-</span>bus <span style="color:#960050;background-color:#1e0010">→</span> B <span style="color:#960050;background-color:#1e0010">的</span> Agent Core
</span></span><span style="display:flex;"><span>B <span style="color:#960050;background-color:#1e0010">处理完</span> <span style="color:#960050;background-color:#1e0010">→</span> <span style="color:#960050;background-color:#1e0010">回复消息（同上反向流程）</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="技术选型">技术选型</h2>
<table>
  <thead>
      <tr>
          <th>组件</th>
          <th>选型</th>
          <th>理由</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Gateway</td>
          <td>Go + 标准库</td>
          <td>高并发、低延迟</td>
      </tr>
      <tr>
          <td>GAS</td>
          <td>Python</td>
          <td>Agent 生态主力语言，便于集成</td>
      </tr>
      <tr>
          <td>消息可靠性</td>
          <td>Transactional Outbox</td>
          <td>不依赖分布式事务，单实例即可保证不丢</td>
      </tr>
      <tr>
          <td>推送</td>
          <td>SSE 长连接</td>
          <td>比 WebSocket 简单，单向推送足够</td>
      </tr>
      <tr>
          <td>存储</td>
          <td>MySQL (SoT) + Redis (在线态/缓存)</td>
          <td>成熟可靠</td>
      </tr>
      <tr>
          <td>Agent 通信协议</td>
          <td>MCP (a2a-bus)</td>
          <td>标准化，Agent 无需感知 mesh 细节</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步">下一步</h2>
<p>后续文章将深入介绍：</p>
<ul>
<li><a href="/zh/posts/gas-sidecar/">GAS：为 AI Agent 设计一个本地运行时</a> — Sidecar 架构与 MCP 集成</li>
<li><a href="/zh/posts/messaging-infrastructure/">消息底座：构建可靠的分布式通信系统</a> — Outbox + Worker 的实现细节</li>
<li><a href="/zh/posts/service-discovery/">服务发现：为什么不需要传统注册中心</a> — 基于消息的间接发现</li>
</ul>
<hr>
<blockquote>
<p>这是 Agent-Mesh 技术博客的第一篇文章，欢迎关注后续更新。</p>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
