Skip to content

Agent 通信:注册与通信为什么可以在一起

AI Agent 正在从单体应用走向多 Agent 协作。一个复杂任务,由多个 Agent 分工完成:翻译 Agent、搜索 Agent、代码执行 Agent,各自负责一块,互相调用。

这个模式在实际落地时遇到的第一个工程问题,不是 Agent 本身的能力,而是通信。

Agent 之间的通信和传统微服务通信不一样。微服务是同构的,部署在已知的基础设施上,IP、端口相对固定,服务发现是一个内部问题。Agent 不一样:它可能运行在任何地方,能力是动态声明的,调用方不关心它部署在哪,只关心它能做什么。

两个 Agent 可能来自不同的组织、不同的框架、不同的运行时,需要在没有共同基础设施的前提下完成协作。Nacos、Consul 这类传统服务发现解决的是"找到这个服务的地址",解决不了"找到能完成这件事的 Agent"。

A2A(Agent-to-Agent)协议是 Google 主导、多家厂商参与的开放标准,目标是解决异构 Agent 之间的互操作问题。它定义了 Agent 如何描述自己的身份和能力(Agent Card),如何被发现(Agent Registry),以及 Agent 之间的任务协议(Task、Message、Artifact)。

A2A 对注册和传输的处理是分层的:Agent Card 负责描述,Registry 负责存储和检索,传输层怎么实现留给各方自己决定。这个分层意味着注册中心可以是独立的服务,也可以和消息传输集成在一起,两种方式在协议层面都是合规的。

独立注册中心的好处是解耦,注册和消息系统各自演化,可以替换其中任何一个。代价是用户需要同时维护两套系统,处理两者之间的状态同步。

一个典型的问题是:Agent 断开连接时,注册中心不一定能及时感知,可能出现 Registry 里还有记录、但 Agent 已经不在线的情况;消息队列里已经在途的消息,也需要额外的机制来处理。把注册中心内嵌在 broker 里,这些状态同步问题由 broker 自己处理。Agent 连接断开,broker 直接感知,注册状态和消息状态同步更新,不需要两套系统之间的协调。

如下图所示,mq9 选择把注册中心放在 broker 里。

img

想达到的效果是:用户连上一个 broker,用一个 SDK,完成 Agent 通信需要的所有事情——注册自己、发现别人、可靠发送消息,不需要额外部署注册中心,不需要维护两套配置。从代码角度,流程是这样的:

python
agent = Mq9A2AAgent()
await agent.connect()

# 创建 mailbox,注册自己,开始接收消息
mailbox = await agent.create_mailbox(card.name)
await agent.register(card)

# 发现其他 Agent,支持自然语言语义搜索
results = await agent.discover("translation agent")

# 可靠发送消息,broker 保障投递
msg_id = await agent.send_message(results[0]["mailbox"], request, reply_to=mailbox)
  • create_mailbox 在 broker 里创建这个 Agent 的专属信箱,消息持久化存储,Agent 重启后可以继续消费未处理的消息。
  • register 把 Agent Card 发布到 broker 内置的 Registry,让其他 Agent 能发现它。
  • discover 支持自然语言语义搜索,不需要知道对方的精确名称,描述能力就能找到。
  • send_message 发出去的消息由 broker 保障投递,发送方拿到 msg_id 就说明消息已经进队列,不会因为对方暂时不在线而丢失。Agent 之间的关系是对等的,每个 Agent 既可以发消息,也可以接收消息,没有固定的 client/server 角色。发出去的任务结果通过 reply_to 指定的 mailbox 异步返回,发送方不需要阻塞等待。

mq9 的 A2A 实现遵循 A2A 协议标准。Agent Card 的字段定义、任务状态的流转(WORKING → Artifact → COMPLETED)、事件类型(TaskStatusUpdateEvent、TaskArtifactUpdateEvent)都和 A2A 规范保持一致,用 mq9 写的 Agent 可以和其他遵循 A2A 标准的实现互通。注册中心在 broker 里是一种实现选择,不影响协议层的兼容性。

A2A 协议把注册和传输分开定义,给了实现层足够的灵活性。注册中心独立部署和内嵌 broker 都是合理的选择。

mq9 选择内嵌,目标是让 Agent 通信的接入成本尽量低。一个 broker,一个 SDK,create_mailboxdiscoversend_message,Agent 之间的注册、发现、可靠通信就跑起来了。

🎉 既然都登录了 GitHub,不如顺手给我们点个 Star 吧!⭐ 你的支持是我们最大的动力 🚀