Skip to content

$mq9.AI.* 协议设计文档

概述

$mq9.AI.* 是 mq9 为 Agent 异步通信设计的协议。核心解决的问题:Agent 之间的异步通信,发件方和收件方不需要同时在线。

mq9 只解决通信问题——消息怎么可靠送达。至于消息里装什么、怎么用、业务语义是什么,mq9 不管。消息内容是 byte 数组,不解析、不校验、不限制。


基础概念

mail_id:通过 MAILBOX.CREATE 创建邮箱时返回的通信地址。不绑定 Agent 身份,一个 Agent 可以为不同任务申请不同的 mail_id。用完不管,TTL 自动清理。

私有邮箱的 mail_id 由系统生成,不可猜测。公开邮箱的 mail_id 由用户自定义,有意义的名字——task.queueanalytics.result

mail_id 不可猜测即安全边界。 知道 mail_id 就能发消息、能订阅。不知道 mail_id 就无从操作。没有 token,没有 ACL。

TTL:邮箱创建时声明,到期自动销毁,消息随之清理。CREATE 幂等,重复创建同一邮箱不报错,TTL 以第一次创建为准。

priority:可选。不指定为 normal 默认优先级,指定 urgent 或 critical 可提升处理顺序。同优先级 FIFO,跨优先级高优先处理。存储层保证顺序,消费方无需自行排序。

msg_id:每条消息的唯一标识,客户端用于去重。

订阅语义:每次订阅全量推送所有未过期消息,后续新消息实时推送。不区分已读/未读,不追踪消费位点。服务端零消费状态。

消息流程:消息到达 → 写存储 → 在线则实时推送,不在线则等待 → 订阅者上线时全量推送所有未过期消息。


协议总览

Subject方向持久化说明
$mq9.AI.MAILBOX.CREATEPUB创建邮箱
$mq9.AI.MAILBOX.MSG.{mail_id}PUB/SUB发消息/接收消息,normal 优先级
$mq9.AI.MAILBOX.MSG.{mail_id}.urgentPUB/SUB紧急消息
$mq9.AI.MAILBOX.MSG.{mail_id}.criticalPUB/SUB最高优先级消息
$mq9.AI.MAILBOX.LIST.{mail_id}PUB查看邮箱当前内容
$mq9.AI.MAILBOX.DELETE.{mail_id}.{msg_id}PUB删除指定消息

$mq9.AI.MAILBOX.CREATE

创建邮箱。私有邮箱 mail_id 系统生成,公开邮箱 mail_id 用户自定义。

创建私有邮箱

bash
nats pub '$mq9.AI.MAILBOX.CREATE' '{"ttl": 3600}'

# 响应
{"mail_id": "m-uuid-001"}

创建公开邮箱

bash
nats pub '$mq9.AI.MAILBOX.CREATE' '{
  "ttl": 3600,
  "public": true,
  "name": "task.queue",
  "desc": "任务队列"
}'

# 响应
{"mail_id": "task.queue"}

public: true 的邮箱创建后 mail_id 对外可见,TTL 到期自动移除。

CREATE 是幂等的。邮箱已存在则静默返回成功,TTL 以第一次创建为准。


$mq9.AI.MAILBOX.MSG.

消息通道。同一个 subject,PUB 发消息,SUB 接收消息。

发消息

知道 mail_id 即可发送,无需任何授权。

bash
# normal 优先级,大多数场景直接用这个
nats pub '$mq9.AI.MAILBOX.MSG.{mail_id}' 'payload'

# 需要优先处理时,显式指定
nats pub '$mq9.AI.MAILBOX.MSG.{mail_id}.urgent'   'payload'
nats pub '$mq9.AI.MAILBOX.MSG.{mail_id}.critical' 'payload'

priority

语义典型场景
不指定(normal)默认,大多数消息任务分发、结果返回、状态上报
urgent紧急,优先处理审批请求、重要通知
critical最高优先级任务中断、紧急指令

消息内容是 byte 数组,mq9 不解析、不校验、不限制格式。用户传什么,mq9 原样存储和投递。

接收消息

bash
# 订阅所有消息(normal + urgent + critical)
nats sub '$mq9.AI.MAILBOX.MSG.{mail_id}'
nats sub '$mq9.AI.MAILBOX.MSG.{mail_id}.>'

# 仅订阅最高优先级
nats sub '$mq9.AI.MAILBOX.MSG.{mail_id}.critical'

# 竞争消费
nats sub '$mq9.AI.MAILBOX.MSG.{mail_id}.>' --queue workers

订阅即全量推送——所有未过期消息立即推送,后续新消息实时推送。

竞争消费——多个订阅者可以用 queue group 竞争消费,每条消息只被一个订阅者处理:

bash
nats sub '$mq9.AI.MAILBOX.MSG.{mail_id}.>' --queue workers

禁止的操作

bash
nats sub '$mq9.AI.MAILBOX.MSG.*'  # 禁止,broker 拒绝
nats sub '$mq9.AI.MAILBOX.MSG.#'  # 禁止,broker 拒绝

订阅必须精确到 mail_id,不允许通配符订阅所有邮箱。


$mq9.AI.MAILBOX.LIST.

查看邮箱当前存储的所有消息,不影响订阅推送。request/reply 模式,PUB 请求,server 返回快照。

bash
nats request '$mq9.AI.MAILBOX.LIST.{mail_id}' ''

# 响应
{
  "mail_id": "m-uuid-001",
  "messages": [
    {"msg_id": "msg-001", "priority": "critical", "ts": 1234567890},
    {"msg_id": "msg-002", "priority": "urgent",   "ts": 1234567891},
    {"msg_id": "msg-003", "priority": "normal",   "ts": 1234567892}
  ]
}

$mq9.AI.MAILBOX.DELETE.{mail_id}.

删除邮箱中的指定消息。已处理的消息可以显式清理,保持邮箱干净。

bash
nats pub '$mq9.AI.MAILBOX.DELETE.{mail_id}.{msg_id}' ''

# 响应
{"deleted": true}

公开邮箱

公开邮箱没有独立的发现机制。mail_id 由用户自定义为有意义的名字——task.queueanalytics.result——知道名字直接订阅即可:

bash
nats sub '$mq9.AI.MAILBOX.MSG.task.queue.>'

创建时指定 public: true 和自定义名字:

bash
nats pub '$mq9.AI.MAILBOX.CREATE' '{
  "ttl": 3600,
  "public": true,
  "name": "task.queue",
  "desc": "任务队列"
}'

# 响应
{"mail_id": "task.queue"}

公开邮箱和私有邮箱的区别只在于 mail_id 是否可预测,通信机制完全一致。

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