小龙虾(OpenClaw)源码分析6:队列与并发,如何避免消息串台
文章目录
到了线上场景,最容易把AI助手搞崩的,不是“模型智商不够”,而是“并发消息打架”。
这篇就看OpenClaw怎么处理这件事。
问题背景:为什么要队列
想象一个群聊里连续刷3条消息,或者你在手机上连续追问。
如果系统同时起多个Agent回合,容易出现:
- 会话文件竞争写入
- 回复顺序错乱
- 上一轮工具调用和下一轮输入互相干扰
OpenClaw的策略很明确:
按会话串行,按全局限流并行。
两层控制:会话层 + 全局层
根据官方队列文档,可以理解为两层:
- 会话层:同一session只允许一个活跃回合
- 全局层:总并发受
maxConcurrent等配置约束
这俩组合起来,就能在“避免串台”和“保持吞吐”之间做平衡。
queue mode怎么选
OpenClaw有几个常见模式:
collect:收集后合并成下一轮(默认思路,稳)followup:等当前回合结束后再开新回合steer:在当前回合边界注入引导steer-backlog:边引导边保留后续回合
我个人建议:
- 大多数场景先用
collect - 对实时引导要求高再试
steer steer-backlog谨慎用,容易让用户感觉“回了两次”
防抖与上限同样关键
文档里提到的几个参数很实用:
debounceMscapdrop(溢出策略)
这些参数决定的是“拥塞时怎么退化”,不是锦上添花,是保命项。
一个实战配置例子
{
messages: {
queue: {
mode: "collect",
debounceMs: 1000,
cap: 20,
drop: "summarize"
}
}
}
这个配置思路是:
优先保证系统稳定,超量时用摘要而不是硬丢。
排障思路
遇到“怎么回复慢了/卡了”的问题时,先看三件事:
- 队列是否在堆积(等待时间日志)
- 是单会话阻塞还是全局并发打满
- 工具调用是否把回合拖太长
很多时候不是模型慢,而是某个会话里的长任务占住了执行位。
小结
这一篇重点:
- OpenClaw的并发不是“谁快谁上”,而是有秩序的队列调度
- 会话串行保证正确性,全局并发保证吞吐
collect一般是最稳妥默认值
下一篇我们继续聊“流式输出”,看看为什么有时候回复会边生成边发、有时候又一次性返回。
