mq9 与 A2A:传输层与应用层的关系
Agent 通信领域正在形成两个方向的标准化努力:Google 主导的 A2A(Agent2Agent Protocol)定义 Agent 之间"怎么对话",mq9 定义 Agent 之间的消息"怎么送达"。这篇文章聊一下这两个协议各自是什么、解决什么问题、以及它们之间的关系。
A2A 是什么
A2A(Agent2Agent Protocol)是 Google 在 2025 年 4 月推出的开放协议,现已捐给 Linux Foundation,目前有 150+ 组织背书。
A2A 解决的核心问题是:不同框架、不同厂商构建的 Agent 之间怎么互通。 你用 LangGraph 构建的 Agent,怎么跟别人用 CrewAI 构建的 Agent 协作?A2A 给了一套标准答案。
A2A 的核心概念
Agent Card:每个 Agent 发布一个 JSON 文件(/.well-known/agent.json),声明自己的名字、能力、端点、支持的认证方式。类似 Agent 的名片,其他 Agent 通过这个文件发现它、了解它能做什么。
Task:A2A 的核心交互单元。Client Agent 向 Server Agent 发起一个 Task,Server Agent 处理并返回结果。Task 有完整的生命周期状态:submitted → working → input-required → completed / failed。
Message:Task 内部的通信单元,支持文本、文件、结构化数据等多种内容类型。
能力协商:Agent 之间可以协商支持的数据格式和交互模式,确保双方能理解彼此。
A2A 的传输方式
A2A 建立在 HTTP + JSON-RPC + SSE 之上(v0.3 加了 gRPC 支持)。基本流程是:
Client Agent Server Agent
| |
|-- HTTP POST (JSON-RPC) -------->| 发起 Task
| | 处理中...
|<--- SSE 流式推送 --------------| 推送进度
| |
|<--- HTTP Response --------------| 返回结果这是一个典型的同步 RPC 模型——Client 发请求,Server 处理,返回结果。长任务通过 SSE 流式推送进度,但本质还是 HTTP 请求-响应。
A2A 与 MCP 的关系
官方定位是互补:MCP(Model Context Protocol)解决 Agent 到工具的连接(Agent ↔ Tool),A2A 解决 Agent 到 Agent 的通信(Agent ↔ Agent)。
Agent ←→ Tool = MCP(工具调用)
Agent ←→ Agent = A2A(协作通信)mq9 是什么
mq9 是 RobustMQ 为 AI Agent 设计的通信传输层,基于 NATS 协议,提供异步邮箱通信能力。
mq9 解决的核心问题是:Agent 之间的消息投递——发件方和收件方不需要同时在线。
mq9 的核心概念
mq9 的全部协议只有四个命令字:
MAILBOX.CREATE — 申请邮箱,拿到 mail_id
MAILBOX.QUERY.{mail_id} — 查询未读消息(兜底拉取)
INBOX.{mail_id}.{priority} — 点对点邮箱通信
BROADCAST.{domain}.{event} — 公共广播INBOX 是私人邮箱:知道对方地址,写好信投进去。对方在不在家不管,信在邮箱等着。支持三级优先级(urgent / normal / notify)。
BROADCAST 是公共广播:不需要知道发给谁,按频道喊,关心的人自己来听。支持通配符订阅和 queue group 竞争消费。
mq9 的消息流程
消息到达 → 写存储 → 检查订阅者在线?
|
在线 → 推送给订阅者 → ACK → 标记已消费
离线 → 消息在存储等待 → 对方上线订阅或 QUERY 拉取先存储后推送。推送是加速通道,存储是兜底。QUERY 是最后的保底手段。
两个协议解决的是不同层次的问题

A2A 是应用层协议——定义的是 Agent 之间怎么"对话"。Task 结构、能力声明、交互流程、认证机制、多模态协商,这些都是语义层面的事情。
mq9 是传输层协议——定义的是消息怎么"送达"。存储、推送、优先级、TTL、离线投递,这些都是投递层面的事情。
A2A 不管消息怎么送到对方,mq9 不管消息里的任务语义是什么。两个层次,天然互补。
类比网络协议栈:
HTTP(应用层) ← 定义请求方法、状态码、Header、Body
TCP(传输层) ← 定义可靠传输、流控、重传A2A(应用层) ← 定义 Agent Card、Task、Message、能力协商
mq9(传输层) ← 定义邮箱、广播、优先级、离线投递mq9 之于 A2A,就像 TCP 之于 HTTP。HTTP 不管 TCP 怎么保证数据到达,TCP 不管 HTTP 请求里写了什么。
A2A 今天的短板
A2A 设计得很完整,但有一个根本性的短板:它假设双方都在线。
A2A 建立在 HTTP 上,HTTP 是同步协议——Client 发请求,Server 必须在线接收并响应。如果 Server Agent 不在线呢?HTTP 请求直接失败,Connection refused 或 Timeout。
对企业内部的 Agent 系统,这个问题可能还好——Agent 通常部署在稳定的服务器上,在线率较高。但对更广泛的 Agent 场景——边缘设备上的 Agent、临时启动的 Agent、跨网络环境的 Agent——离线是常态,不是异常。
A2A 协议本身没有定义离线场景怎么处理,把这个问题留给了实现方。
A2A 的传输层可以有多种选择
A2A 本身是应用层协议,它不绑定传输层。今天跑在 HTTP 上,是因为 Google 选了这个默认实现。但 A2A 的协议规范——Agent Card、Task、Message——跟 HTTP 没有强绑定。
那 A2A 的传输层可以有多种选择:

A2A over HTTP ← 双方在线,同步请求-响应,实时交互
A2A over gRPC ← 双方在线,高性能,流式推送(v0.3 已支持)
A2A over mq9 ← 不需要同时在线,异步投递,离线可达Agent 根据场景自己选传输方式:
- 对方在线、需要实时交互 → 走 HTTP / gRPC
- 对方可能不在线、不需要实时 → 走 mq9
- 同一个 Agent,有些任务走 HTTP,有些走 mq9,按需切换
这就像今天的 Web 世界——同一个服务,REST API 走 HTTP,事件通知走 WebSocket,异步任务走消息队列。不是非此即彼,是按场景选传输。
A2A over mq9 长什么样
具体来看,A2A 的 Task 消息通过 mq9 传输会是什么样:
Agent Card 发布:Agent 把自己的 Agent Card 写入一个 type=latest 的 mq9 邮箱。其他 Agent 订阅或查询这个邮箱,获取能力声明。不需要暴露 HTTP 端点,不需要 /.well-known/ 路径。
Task 发起:Client Agent 把 A2A 格式的 Task 消息 PUB 到 Server Agent 的 mq9 邮箱。Server Agent 不在线?消息在邮箱等着。
Task 状态更新:Server Agent 处理过程中,把状态更新(working、input-required)PUB 到 Client Agent 的邮箱。
Task 完成:Server Agent 把结果 PUB 到 Client Agent 的邮箱。
整个流程: 
关键点:mq9 不解析 A2A 的 Task JSON,只负责投递。 A2A 的 Task 结构、状态机、能力协商——这些都是 payload 里的内容,mq9 不需要理解它。适配层在 A2A 这边做,mq9 的代码一行不用改。
mq9 的边界
这里要明确一件事:mq9 只管投递,不管语义。
A2A 定义的那些能力——Agent Card、Task 生命周期、多模态协商——mq9 一个都不做。不是做不了,是不该做。
mq9 是管道,不是信封。管道只负责:送到、不丢、有优先级、能广播。信封里装什么、怎么拆、拆完怎么处理,是上层的事。
上层怎么通过投递和订阅来组合语义,是 A2A 的事情。A2A 决定 Task 状态更新走 INBOX 还是 BROADCAST,A2A 决定 Agent Card 用哪种邮箱类型,A2A 决定能力查询走广播还是点对点——这些都是应用层的设计决策,跟 mq9 无关。
这样 mq9 的边界永远干净——四个命令字,不膨胀,不侵入应用语义。上层不管是 A2A、MCP、还是自定义协议,都可以跑在 mq9 上面。
为什么不是竞争
有人可能会问:A2A 和 mq9 都在解决 Agent 通信问题,难道不是竞争吗?
不是。用一个类比就清楚了:
A2A 像打电话——双方都在线,实时交互,你说一句我回一句,挂了就结束。适合需要即时反馈的场景。
mq9 像发邮件——对方不在也能发,信在邮箱等着,对方空了来取。适合异步、离线、不需要即时反馈的场景。
打电话和发邮件不是竞争关系,是互补。你不会因为有了邮件就不打电话,也不会因为能打电话就不用邮件。
同样,A2A 和 mq9 覆盖的是不同场景:
| 场景 | A2A over HTTP | A2A over mq9 |
|---|---|---|
| 双方在线,需要实时交互 | 适合 | 不必要 |
| 一方可能离线 | 做不到 | 适合 |
| 长任务,需要异步等待结果 | SSE 轮询,复杂 | 邮箱天然支持 |
| 边缘设备,网络不稳定 | 不可靠 | 离线消息持久化 |
| 海量临时 Agent 间通信 | HTTP 连接成本高 | pub/sub 轻量 |
| 任务广播,竞争消费 | 不支持 | BROADCAST + queue group |
A2A over HTTP 和 A2A over mq9 不是替代关系,是补充关系。一个 Agent 系统里两种都会用到。
对 mq9 的意义
从 mq9 的角度看,A2A 的存在是好事。
A2A 验证了方向。 Google 联合 150+ 组织推 Agent 通信标准化,说明 Agent 之间的通信确实是一个需要被解决的问题。mq9 不是在解决一个想象的问题。
A2A 定义了应用层,mq9 不需要做了。 如果没有 A2A,mq9 可能会忍不住往协议里加 Task 状态、能力声明、多模态支持——然后越来越重,越来越不像传输层。有了 A2A 做应用层,mq9 可以安心做好传输层,保持四个命令字的简洁。
A2A 的短板是 mq9 的机会。 A2A over HTTP 搞不定离线场景,这正是 mq9 的核心价值。不是 mq9 要去"推"这个组合,而是当 A2A 用户真的遇到离线问题时,mq9 已经是一个现成的答案。
长期视角
站远一点看,Agent 通信的协议栈可能会长成这样:

每一层只做自己的事,每一层可以独立演进。A2A 升级到 v1.0,mq9 不需要改。mq9 加新的存储引擎,A2A 不受影响。RobustMQ 升级集群方案,上面两层都无感知。
这就是分层的价值——每一层的稳定性不依赖其他层的变化。
mq9 在这个栈里的位置是清晰的:传输层,保证送达,不多不少。上面跑什么协议,下面用什么存储,mq9 都不关心。
这个定位不大,但很稳。做好传输层这一件事,就够了。
