Agent 通信的现状与未来:从推演看 mq9 的位置
mq9 要做的事情——为 Agent 异步通信定义一套标准协议——听起来有价值,但有几个问题需要回答:现有的基础软件为什么不能演进解决?不只是消息队列,其他基础软件呢?对开发者来说,今天的痛点到底有多真实?这个需求是 Agent 时代才有的吗?
这篇文章从这几个角度做一次完整推演。
邮箱通信是新需求吗?
不是。这个需求一直存在。
Agent 之前是什么?是微服务。微服务之间的异步通信问题,跟 Agent 通信本质上是同一个问题——发件方和收件方不需要同时在线,消息不能丢,要有优先级,要能广播。
微服务时代怎么解决的?每个团队自己拼——RabbitMQ 做一点,Kafka 做一点,Redis 做一点,HTTP 回调做一点。能用,但从来没有一个统一的、足够简单的标准方案。
为什么没人做?因为微服务的生命周期够长,在线时间够稳定,HTTP + 重试基本够用,痛点没痛到非解决不可。大家忍一忍,拼一拼,也就过去了。
Agent 把这个痛点放大了十倍。生命周期从几个月缩短到几秒,在线时间从稳定变成不可预测,数量从几十个变成几万个。之前"忍一忍"的方案,在 Agent 场景下彻底崩了——HTTP 调不通,Redis 消息丢了,Kafka 太重用不起来。
所以不是"Agent 时代才需要邮箱通信",是"Agent 时代让邮箱通信的需求变得不可忽视了"。需求一直在,只是之前不够痛,现在痛到了必须有人专门解决的程度。
mq9 解决的不是一个全新的问题,是一个老问题的新爆发。
消息队列能演进出 Agent 邮箱吗?
逐个看。
Kafka / Confluent
Kafka 要解决 Agent 邮箱通信,得在 append only log 上做加法:加临时 topic 自动创建销毁、加优先级(今天没有)、加 TTL 自动清理、加轻量级身份管理。
有人会说:Kafka 从日志收集演进到了流处理、事件溯源、CQRS,每一次都有人说"Kafka 不适合这个场景",每一次 Kafka 都证明了自己。Agent 通信为什么不行?
区别在于:之前的每一次演进,都是同一个模型的自然延伸——都是高吞吐持久化数据流,append only log 的假设没变。但 Agent 邮箱要的是临时通道、优先级队列、自动清理——这不是延伸,是跟现有模型冲突。Kafka 可以加这些 feature,但加完之后 Kafka 就有两套心智模型:数据流和邮箱。一个产品里两套心智模型,对用户是负担,对工程团队是维护成本。
更现实的问题是实现成本。加邮箱语义不是改几行代码——得改存储模型、加优先级队列、加动态 topic 生命周期管理、加 TTL 清理机制。改完之后跟原来的 Kafka 代码几乎是两套系统共存在一个进程里。这个成本,Confluent 的工程团队不会接受。不是做不出来,是不合适做,做了也是全新做。
更可能的路径是 Confluent 在上层封装一个 Agent 通信框架,底层还是 Kafka。能用,但重,而且 Kafka 的商业模型是卖吞吐量和存储量,Agent 邮箱这种轻量级通信场景跟它的收入模型不匹配。
NATS
NATS 是离 mq9 最近的。Core pub/sub 已经有了,subject 寻址已经有了,queue group 已经有了。
NATS 的人会说:JetStream 上加一套 Agent 通信的 feature,再出一个 nats-agent 的官方 SDK,把四个命令字全部包进去,用户体验跟 mq9 一样简单。你说我们"不会为一个场景做深度定制",但如果这个场景足够大,我们为什么不会?
这个反驳有道理,但要看具体怎么做。JetStream 的 stream 是预创建的、长期存在的、有 offset 的。邮箱是动态创建的、临时的、没有 offset 的。在 JetStream 上做邮箱,要么每个邮箱一个 stream——创建成本高,JetStream 不是为海量 stream 设计的;要么所有邮箱共享一个 stream 然后用 filter subject 区分——失去了隔离性,TTL 和清理变复杂。SDK 能封装 API,封装不了底层模型的错配。
要真正做好,NATS 也得在 JetStream 之外新开一条路——专门为邮箱场景设计存储和生命周期管理。这跟全新做的成本是同一个量级。
第二个现实问题是 NATS 是通用基础设施,它要兼顾所有用户。更可能的结果是出一些通用 feature(更灵活的 TTL、优先级支持),但不会定义 $mq9.AI.* 这样的场景化命名空间,也不会为邮箱语义做深度定制。
Pulsar
Pulsar 有延迟消息、有 TTL、有多租户,底子比 Kafka 好一些。但核心抽象还是 topic/subscription/cursor,为持久化消息流设计。
要长出邮箱语义,同样面临"不合适做,做了也是全新做"的问题。StreamNative 现在的方向是 Kafka 兼容和 Iceberg 融合,Agent 通信不在路线图上。Pulsar 生态本身在收缩,做这个事的动力不足。
Redis
Redis 其实最有可能从另一个方向逼近。它有 pub/sub、有 Stream、有 TTL、有轻量级数据结构。
如果有人在 Redis 上定义一套 Agent 邮箱约定——用 Stream 做持久化邮箱、用 pub/sub 做广播、用 Sorted Set 做优先级——技术上能拼出来。
但拼出来的东西是一堆 Redis 命令的组合,没有统一语义,没有协议级别的约定,每个团队的实现都不一样。而且 Redis 是内存数据库,成本结构不对——Agent 通信消息量大了,内存撑不住。
RabbitMQ
RabbitMQ 的 AMQP 模型在灵活性上最接近——exchange 做路由,queue 做存储,天然分层。而且有优先级队列、有 TTL、有 reply-to。
但性能天花板和单机架构是硬伤,Erlang 的限制在那里。社区的注意力在追 Kafka 兼容(AMQP 1.0、Stream 插件),不在 Agent 场景上。
不只是消息队列:其他基础软件能长出邮箱吗?
邮箱通信需要四个能力同时满足:持久化存储、实时推送、广播/订阅、生命周期管理。把所有基础软件品类摊开来看。
数据库
一张表就能做邮箱——mail_id、priority、payload、created_at、ttl。发消息就是 INSERT,收消息就是 SELECT + DELETE,优先级就是 ORDER BY,TTL 就是定时任务清理过期行。很多团队今天就是这么干的——轮询数据库。
有人会说:Postgres 有 LISTEN/NOTIFY,Supabase 在上面做了实时订阅,不能说数据库"没有推送"。
这个批评有道理,表述确实需要更精确。但 Postgres LISTEN/NOTIFY 是进程级的,不跨连接持久化,连接断了通知就丢了——跟 Redis pub/sub 一个问题。Supabase 的实时订阅是在上面加了一层 WebSocket + 变更捕获,本质上是在数据库上搓 pub/sub 引擎,正好证明了一点:数据库自己做不到,得加东西。加完那些东西,复杂度已经不亚于直接用消息队列了。
广播和通配符订阅也没有原生支持。数据库能长出邮箱的存储部分,但长不出实时推送和广播部分。
etcd / ZooKeeper / Nacos
分布式协调服务,核心能力是强一致 KV 存储 + Watch 变更通知。Watch 机制很接近邮箱的"实时推送"——key 变了订阅者立刻收到通知,etcd 的 Watch 甚至支持前缀匹配。
有人会说 etcd Watch + Lease TTL 组合起来能覆盖的场景比想象的多。确实如此,但有几个硬限制绕不过去。这些系统为强一致设计,每次写入都走共识协议,写性能很低,撑不住高频消息——它们是为"低频写、高频读"的配置管理场景优化的。key 只有最新值,没有"邮箱里有五封信"的概念。没有广播,没有 queue group,没有优先级。存储容量有限,etcd 官方建议数据量不超过几个 GB。
能力有没有和能力够不够用是两个问题。etcd 这类能长出"状态感知",但长不出完整邮箱。
时序数据库
InfluxDB、TDengine、TimescaleDB,核心是按时间戳高效写入和查询。存储部分能做——消息按时间写入,TTL 用 retention policy 原生支持,写入吞吐通常很高。
但跟数据库一样没有实时推送,纯 pull 模型。而且查询模型不匹配——时序数据库是"按时间范围聚合",邮箱要的是"按优先级取最早的未读消息"。
时序数据库能做邮箱的归档和分析,但做不了实时通信层。
S3 / 对象存储
S3 能存消息,用 prefix 模拟邮箱目录结构,TTL 用 lifecycle policy。但没有实时通知(Event Notification 延迟太高),没有 pub/sub,没有优先级。适合做归档层,不适合做通信层。
RPC 框架(gRPC、Dubbo)
RPC 是同步的、点对点的,要求双方在线。跟邮箱的"异步、离线可达"完全相反。要在 RPC 上做邮箱,得加持久化队列做中转——加完之后 RPC 只剩序列化协议,通信能力全靠那个队列。本末倒置。
IBM MQ 等企业级消息中间件
IBM MQ 是老牌企业级消息中间件,1993 年就有了。论功能最全——持久化队列、优先级、死信队列、事务消息、点对点、pub/sub、TTL、安全认证,全都有。IBM MQ 的队列模型天然就是邮箱。
但为什么没人用它做 Agent 邮箱?太重了——部署配置运维需要专门的 MQ 管理员。太贵了——商业授权按 CPU 核心收费。太封闭了——跟 Docker、K8s、云原生的工具链格格不入。TIBCO、Oracle AQ、Azure Service Bus 类似的逻辑,能做但都绑定在特定企业生态或云平台上。
IBM MQ 能做邮箱,但它解决的是银行和航空公司的问题,不是 AI Agent 的问题。
企业开发框架(Spring、Django)
框架本身不做通信,它们集成通信组件。邮箱能力取决于底层集成的是什么。框架层能做的是封装一层邮箱 API 屏蔽底层差异,但底层的问题还在。
推演图谱
| 品类 | 有存储 | 有推送 | 有广播 | 有生命周期管理 | 能做邮箱? |
|---|---|---|---|---|---|
| 关系数据库 | ✓ | 有限(LISTEN/NOTIFY) | ✗ | 需自建 | 能存,推送不可靠 |
| Redis | ✓ | ✓ | ✓ | ✓ | 能拼,不可靠,成本高 |
| S3 / 对象存储 | ✓ | ✗ | ✗ | ✓ | 只能做归档 |
| etcd / ZK / Nacos | ✓(容量小) | ✓(Watch) | ✗ | ✓ | 只能做状态感知 |
| 时序数据库 | ✓ | ✗ | ✗ | ✓ | 只能做归档和分析 |
| RPC 框架 | ✗ | ✓(同步) | ✗ | ✗ | 完全不合适 |
| IBM MQ 等企业 MQ | ✓ | ✓ | ✓ | ✓ | 功能够,太重太贵 |
| Kafka | ✓ | ✓ | 需配置 | 需管理 | 模型不匹配,改造成本高 |
| NATS + 消息队列 | ✓ | ✓ | ✓ | ✓ | 最接近,缺场景聚焦 |
这张表有简化,每个基础软件的能力是一个光谱不是开关。但光谱上的位置不影响结论:没有谁在邮箱通信需要的四个能力上都处于"生产可用且成本合理"的位置。
消息队列是唯一天然同时具备"存储 + 推送 + 订阅"的基础设施品类。邮箱从消息队列上长出来,不是巧合,是因为消息队列的能力模型跟邮箱的需求模型重合度最高。
有人会质疑:你选了邮箱这个隐喻,然后用邮箱的需求去衡量所有基础软件,当然得出"只有消息队列最合适"的结论——这是循环论证。
这个质疑有意思。邮箱确实不是 Agent 通信的唯一可能抽象——黑板模型(共享状态)、事件流(Event Sourcing)、图结构(关系即通信)都是可选的方向。但邮箱不需要是唯一正确的抽象,它只需要是足够好的抽象。黑板模型引入了一致性问题,事件流就是 Kafka 的思路对临时 Agent 太重,图结构描述的是关系不是通信机制。邮箱覆盖了最基本的通信需求:异步、离线可达、优先级、广播。Agent 在邮箱上能组合出八个场景,说明这个抽象的表达力够用。够用就行,不需要完美。
所有推演的共同结论
不管是消息队列还是其他基础软件,要解决 Agent 邮箱通信都面临同一个困境:要么模型不匹配改造成本极高(Kafka/Pulsar/数据库),要么能力最接近但缺乏场景聚焦(NATS/RabbitMQ),要么底层成本结构不对(Redis),要么太重太贵(IBM MQ),要么能力不完整(etcd/时序数据库/S3)。
这里说的"做不到",不是技术上不可能,是在现有架构上做的成本高到不如全新做。Kafka 要加邮箱语义,改完跟原来的代码几乎是两套系统共存。NATS 要在 JetStream 之外新开一条路,跟从零做成本同一个量级。不是做不出来,是不合适做,做了也是全新做。
没有谁会专门为 Agent 通信这一个场景,承担全新做的成本。因为它们都是通用基础设施,要服务所有场景,在这个场景被验证之前,没有哪个成熟产品会为它做深度定制。
等 Agent 通信成为公认的刚需,它们会跟进。但跟进的方式大概率是在现有架构上打补丁,不是重新设计。补丁能用,但不会比原生设计更好。
如果要说最大的技术可能性,我认为是 NATS 官方专门支持这个场景——它的底子最好,距离最近,如果 NATS 团队决定做,是最有可能做好的。
但即便如此,这也是好事。技术世界有趣的地方就在这里——不同的人从不同的方向推动同一个问题,整个行业都会受益。mq9 先定义了这个方向,如果 NATS 跟进,说明方向对了;如果 NATS 做得更好,开发者受益;如果 mq9 做得更贴合场景,开发者也受益。竞争本身就是推动。不怕别人来做,怕的是这个问题没人在意。
开发者今天怎么解决 Agent 通信
抛开基础软件厂商的视角,看看一线开发者的真实体验。
一个典型的多 Agent 项目,开发者的心路历程大概是这样的。
第一天,HTTP 调用。 Agent 之间需要通信,最直觉的选择是写几个 endpoint,A 调 B 的 API。能跑,但很快发现 B 不在线的时候请求直接失败了,得加重试。加完重试需要幂等。加完幂等需要超时处理。一个"发消息"的需求,写了三百行胶水代码。
第二周,引入 Redis。 受不了了,用 pub/sub 做实时通信,用 List 做任务队列,用 key+TTL 做状态存储。三个 Redis 数据结构拼出一个勉强能用的通信层。但发现 pub/sub 不持久化,Agent 重启消息就丢了。换成 Redis Stream,又要管 consumer group、ACK、积压。Redis 从缓存变成了项目里最复杂的组件。
第三周,有人说"用 Kafka 吧"。 引入 Kafka,创建五六个 topic——task-requests、task-results、agent-status、alerts、approvals。每个 topic 配置 partition 数、retention、consumer group。一个月后回头看,团队一半的运维精力在管 Kafka。而且 Agent 是临时的,topic 是永久的,这个错配一直在制造垃圾 topic。
最终状态。 大部分团队的 Agent 通信层是这样的:HTTP + Redis + 一点点 Kafka + 一堆自定义胶水代码。能用,但每个项目的实现都不一样,换个人来维护得重新理解一遍,跨团队协作不可能。
核心痛点不是缺工具,是缺标准。 工具都有,Redis 有、Kafka 有、HTTP 有,但没有一个是为 Agent 通信专门设计的。开发者每次都在用通用工具手搓一个专用方案。
mq9 出来后,开发者的体验变成什么样
同样的项目,第一天:
Connection nc = Nats.connect("nats://localhost:4222");
// 申请邮箱
Message reply = nc.request("$mq9.AI.MAILBOX.CREATE",
"{\"type\":\"standard\",\"ttl\":3600}".getBytes(), Duration.ofSeconds(3));
// 发消息
nc.publish("$mq9.AI.INBOX.{mail_id}.normal", result.getBytes());
// 广播任务
nc.publish("$mq9.AI.BROADCAST.task.available", task.getBytes());没有 HTTP endpoint 要写,没有 Redis 数据结构要选,没有 Kafka topic 要创建。四个命令字,NATS SDK 直接用。
Agent 不在线?消息在邮箱等着。要优先级?换个 subject 后缀。要竞争消费?加个 queue group。要状态感知?申请一个 latest 邮箱。怕有遗漏?QUERY 兜底拉一下。
开发者不需要做的事情:
不需要选型——"这个场景用 Redis 还是 Kafka?"不需要拼积木——"pub/sub + List + Stream 怎么组合?"不需要写胶水——"重试、幂等、超时、清理怎么处理?"不需要运维——"topic 谁创建?partition 几个?consumer group 怎么配?"
开发者只需要做的事情:
想清楚通信模式——是点对点还是广播,需不需要持久化,什么优先级。然后用对应的命令字发消息。完了。
mq9 的本质是什么
不是一个更好的 Redis,不是一个更轻的 Kafka。是 Agent 通信的标准协议约定。
就像 HTTP 之于 Web——在 HTTP 之前,每个网络应用都有自己的通信方式。HTTP 出来后,所有人用同一套协议,生态才能建立起来。
今天的 Agent 通信就是 HTTP 之前的状态:每个团队自己搞,互不相通。mq9 想做的是给这个混乱一个标准答案——$mq9.AI.*,四个命令字,所有 Agent 用同一套协议通信。这样跨团队的 Agent 才能协作,跨系统的 Agent 才能互通,Agent 生态才有可能真正建立起来。
客观评价
价值是有的,但要分两层看。
确定有价值的部分: Agent 异步通信今天确实没有标准答案,开发者确实在用 HTTP+Redis+Kafka 拼凑,确实每个团队都在重复造轮子。这个痛点不是 Agent 时代才有的——微服务时代就在,只是之前不够痛,现在 Agent 把它放大到了不可忽视的程度。一个专门为这个场景设计的、足够简单的协议约定,对有这个痛点的开发者来说是有真实价值的。这个判断不需要赌。
不确定的部分: 这个痛点今天有多普遍、多紧迫。跑多 Agent 系统的团队还不够多,大部分人还在单 Agent 阶段,用 HTTP 调用就够了。mq9 的价值跟多 Agent 系统的普及程度正相关——Agent 越多,通信问题越痛,mq9 越有价值。这个趋势方向是对的,但时间窗口不确定。
方向有价值,时机需要等。但 RobustMQ 三年打磨的底层架构已经在了,等的成本很低。该做的事情——把代码写扎实,把协议定清楚,把文档写好——不依赖时机,现在就可以做。
等那一天来的时候,mq9 已经准备好了。
