OpenClaw 消息队列 / 任务队列分析报告¶
分析日期: 2026-05-01 分析范围:
src/、extensions/、packages/、docs/
五层队列体系总览¶
graph TB
subgraph 入站层
A[入站消息] --> B{QueueMode?}
B -->|steer| C[注入活跃 Run]
B -->|followup/collect| D[Followup 队列]
B -->|interrupt| E[中止当前 Run]
end
subgraph 调度层
D --> F[FollowupQueueState]
F -->|debounce 500ms| G[Drain 循环]
G -->|collect 模式| H[合并多条消息]
G -->|其他模式| I[逐条处理]
end
subgraph 执行层
C --> J[Command Lane Queue]
H --> J
I --> J
J -->|lane: session:<key>| K[串行执行]
J -->|lane: main| L[并发≤4]
J -->|lane: subagent| M[并发≤8]
end
subgraph 出站层
K --> N[Agent Run 完成]
N --> O[出站消息]
O -->|成功| P[ackDelivery]
O -->|失败| Q[Outbound 持久化队列]
Q -->|指数退避| O
Q -->|永久错误| R[failed/]
end
subgraph 通知层
S[子 Agent] --> T[Announce 队列]
T -->|指数退避| U[父 Session]
end
核心模块对照表¶
| 层次 | 核心模块 | 文件路径 | 作用 |
|---|---|---|---|
| 命令车道队列 | CommandQueue | src/process/command-queue.ts (527行) |
进程级序列化 agent 执行,多车道 + 并发上限 |
| 入站 Followup 队列 | FollowupQueueState | src/auto-reply/reply/queue/ |
入站消息排队/合并/转向(Steer)等策略 |
| Announce 队列 | AnnounceQueueState | src/agents/subagent-announce-queue.ts |
子 agent 向父 session 推送通知 |
| Outbound 持久化队列 | QueuedDelivery | src/infra/outbound/delivery-queue-storage.ts |
出站消息落盘、重试、故障转移 |
| 插件扩展队列 | 各渠道独立实现 | extensions/discord/、qqbot/、feishu/ |
各渠道并发控制 |
进程级单例机制¶
所有队列状态通过 Symbol.for() 键挂载到 globalThis,保证多 bundled chunk 共享同一份状态:
| Symbol | 内容 |
|---|---|
openclaw.commandQueueState |
所有车道 Map + gatewayDraining 标志 |
openclaw.followupQueues |
所有 session 的 FollowupQueueState Map |
openclaw.followupDrainCallbacks |
drain 回调缓存,支持空 drain 后重启 |
openclaw.recentQueueMessageIds |
入站消息去重缓存(TTL 5min,上限 10000) |
STER 结论¶
本仓库不存在名为"STER"的机制或缩写。 与 Steering 最相关的是 QueueMode.steer,文档称"Steering queue"(docs/concepts/queue-steering.md)。
报告目录¶
- 命令车道队列 — 进程级最底层,lane 隔离 + 并发控制
- 入站 Followup 队列 — 6 种队列模式,消息调度核心
- Announce 队列 — 子 agent 通知专用,指数退避
- Outbound 持久化队列 — 出站消息落盘,两阶段 ack
- 扩展层队列 — Discord/QQ/飞书各自独立实现
- 不确定点 — 未深入分析的模块