小龙虾(OpenClaw)源码分析6:队列与并发,如何避免消息串台

文章目录

到了线上场景,最容易把AI助手搞崩的,不是“模型智商不够”,而是“并发消息打架”。
这篇就看OpenClaw怎么处理这件事。

问题背景:为什么要队列

想象一个群聊里连续刷3条消息,或者你在手机上连续追问。
如果系统同时起多个Agent回合,容易出现:

  • 会话文件竞争写入
  • 回复顺序错乱
  • 上一轮工具调用和下一轮输入互相干扰

OpenClaw的策略很明确:
按会话串行,按全局限流并行。

两层控制:会话层 + 全局层

根据官方队列文档,可以理解为两层:

  1. 会话层:同一session只允许一个活跃回合
  2. 全局层:总并发受maxConcurrent等配置约束

这俩组合起来,就能在“避免串台”和“保持吞吐”之间做平衡。

queue mode怎么选

OpenClaw有几个常见模式:

  • collect:收集后合并成下一轮(默认思路,稳)
  • followup:等当前回合结束后再开新回合
  • steer:在当前回合边界注入引导
  • steer-backlog:边引导边保留后续回合

我个人建议:

  • 大多数场景先用collect
  • 对实时引导要求高再试steer
  • steer-backlog谨慎用,容易让用户感觉“回了两次”

防抖与上限同样关键

文档里提到的几个参数很实用:

  • debounceMs
  • cap
  • drop(溢出策略)

这些参数决定的是“拥塞时怎么退化”,不是锦上添花,是保命项。

一个实战配置例子

{
  messages: {
    queue: {
      mode: "collect",
      debounceMs: 1000,
      cap: 20,
      drop: "summarize"
    }
  }
}

这个配置思路是:
优先保证系统稳定,超量时用摘要而不是硬丢。

排障思路

遇到“怎么回复慢了/卡了”的问题时,先看三件事:

  1. 队列是否在堆积(等待时间日志)
  2. 是单会话阻塞还是全局并发打满
  3. 工具调用是否把回合拖太长

很多时候不是模型慢,而是某个会话里的长任务占住了执行位。

小结

这一篇重点:

  • OpenClaw的并发不是“谁快谁上”,而是有秩序的队列调度
  • 会话串行保证正确性,全局并发保证吞吐
  • collect一般是最稳妥默认值

下一篇我们继续聊“流式输出”,看看为什么有时候回复会边生成边发、有时候又一次性返回。

参考链接