2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

OpenClaw 如何用纯 TypeScript 造了一套 Agent 调度系统

发布日期:2026-03-13 08:01:42 浏览次数: 2131
作者:唐国梁TGLTommy

微信搜一搜,关注“唐国梁TGLTommy”

推荐语

OpenClaw 用纯 TypeScript 打造了一套轻量级 Agent 调度系统,解决了任务调度中的时间漂移和惊群效应等工程难题。

核心内容:
1. OpenClaw 的 Planning 模块设计理念与 Linux crontab 的异同
2. 锚点对齐算法解决定时任务时间漂移问题
3. 哈希防惊群技术实现任务错峰执行

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

 

 

一个 AI Agent 能自动回答问题、写代码、分析数据,这已经不稀奇了。但如果你想让它每天早上 9 点自动生成工作摘要、每半小时检查一次邮件、出了故障自动告警——而你完全不用盯着它——事情就变得有意思了。

 

光有一个聪明的 Agent 不够,你还需要回答三个工程问题:什么时候启动?结果发给谁?挂了怎么办?

拆解 OpenClaw 的源码,发现它内部有一个叫 Planning 的模块,就是专门解决这三个问题的。8900 行核心代码,不依赖 Redis、不依赖数据库、不需要消息队列,纯 TypeScript 单进程搞定。

这篇文章拆解一下它背后几个让我觉得"确实讲究"的工程设计。

先说清楚:

此 Planning 非彼 Planning

搞 AI 的同学看到"Planning"这个词,第一反应大概是 Plan-and-Execute——Agent 先推理出执行计划,再逐步完成。

OpenClaw 的 Planning 跟这个没关系。它更接近 Linux 世界里的 crontab,是一个运行在 Gateway 进程内部的持久化任务调度系统。关心的不是"怎么思考",而是"怎么准时、可靠地把活干了"。

打个比方:Agent 是员工,Planning 是排班表。

时间对齐:

一个容易忽略的漂移问题

系统支持三种调度模式:一次性定时、固定间隔循环、Cron 表达式。前两种直觉上很简单,但固定间隔模式里藏着一个经典陷阱。

假设一个任务设定每 30 分钟执行一次,10:00 创建。最朴素的实现方式是"跑完当前任务,在完成时间上加 30 分钟"。如果第一次跑到 10:20 才结束,下次就是 10:50,再下次 11:20、11:50……

看出问题了吗?执行时间在不断漂移,越来越偏离预期的整点节奏。

OpenClaw 的做法是引入了锚点对齐算法:以任务创建时间为锚点,下次执行时间永远对齐到锚点的整数倍位置。

锚点 = 10:00,间隔 = 30min,当前 = 10:20
→ 下次执行 = 10:30(而非 10:50)

不管中间每次执行耗时多久,长期运行下时间线永远不会偏。一个很小的设计决策,但体现了做基础设施和做应用层之间的思维差异——基础设施要考虑的是"跑一个月之后还对不对"。

哈希防惊群:

让十个任务不再"挤门口"

另一个经典问题出现在 Cron 表达式模式下。

假设配了十个任务都在整点触发,到了整点全部同时启动,CPU 和内存瞬间被打满。这在分布式系统领域有个名字叫惊群效应(Thundering Herd)

OpenClaw 的解法是给每个任务分配一个确定性偏移量:用任务 ID 的 SHA-256 哈希值对 5 分钟窗口取模。

效果很直观:十个整点任务被自动散开到 0~5 分钟的窗口里,各自错峰执行。因为哈希是确定性的,同一个任务每次算出来的偏移量完全一致,不会忽前忽后,也不需要任何人工配置。

一个让我印象最深的 Bug

在所有设计细节里,让我印象最深的其实是一个已修复的 Bug。

list() 是一个查询任务列表的接口——标准的读操作。但工程师发现,调用它的时候,系统会悄悄把过期任务的下次执行时间往后推

一个读操作,产生了写的副作用。

这导致了一种"灵异现象":有些任务莫名其妙被跳过了,但你查一下列表,状态看起来又是"正常"的——因为查询本身就把状态改了。极难复现,极难定位。

修复方案是将重算逻辑分成了两种模式:

  • 写操作(add / update)执行完整重算,允许推进过期任务的调度时间

  • 读操作(list / status)只做保守重算,只填充空值,绝不修改已有状态

这不只是修了一个 Bug。它确立了一条原则:查询操作永远没有副作用。 系统行为因此变得可预测——这是所有可靠基础设施的前提。

几行代码的并发控制

当多个操作同时要修改任务状态时,怎么保证不出乱子?

OpenClaw 没用锁,没用消息队列,用了一个极简的方案:Promise 链串行化

核心代码只有一行逻辑——每个新操作 .then() 到前一个操作后面。自然排队,自然串行,不可能死锁。

但 Agent 任务可能执行几分钟甚至几十分钟。如果全程串行,其他所有读操作都会被阻塞。所以系统设计了一个分阶段执行模式

  1. Phase 1(锁内):检查状态、标记"正在运行"、持久化,释放锁
  2. Phase 2(锁外):执行 Agent——这一步可能很久,但不影响其他读写
  3. Phase 3(锁内):重新获取锁,把执行结果写回

Phase 3 有一个微妙之处:执行期间,任务的配置可能已经被其他操作修改了。系统的合并策略是"保留执行结果,采用最新配置",思路类似数据库中的 MVCC(多版本并发控制)

五层容错:

Agent "发疯"也不怕

后台跑的 Agent 不可能永远正常。这个模块构建了五层防护网:

  • 执行超时:默认 10 分钟,Agent 轮次最长 60 分钟
  • 卡死检测:超过 2 小时未完成,自动清除运行状态
  • 指数退避:失败后等待时间逐级递增(30s → 1min → 5min → 15min → 60min),避免疯狂重试耗尽资源
  • 瞬态错误自动重试:通过正则匹配识别 rate_limit、timeout、网络错误等临时问题,自动恢复
  • 失败告警 + 冷却期:通知到 Slack/微信,但连续失败不会产生告警风暴

还有一个启动场景的考量:Gateway 重启后可能积压了大量错过的任务。如果全部立刻执行,等于自己给自己制造惊群。系统会按过期时间排序,前 5 个立即执行,后续每个错开 5 秒,平滑铺展开。

结果投递:

不多发,也不漏发

任务跑完了,结果要送出去。投递支持三种模式:

  • announce:推送到 Slack、微信等消息频道
  • webhook:POST 到外部 URL,方便对接自动化流水线
  • none:静默执行,适合纯后台任务

这里有一个容易被忽略的用户体验细节:如果 Agent 在执行过程中已经通过消息工具主动发送了结果,投递引擎会识别出来,跳过重复发送。用户不会收到两条一模一样的消息。

另外,结果投递和失败告警是独立配置的。即使正常结果不需要推送(mode: "none"),失败时也能通知到指定频道。这种关注点分离的设计,避免了"静默任务出了问题但没人知道"的盲区。

零外部依赖的持久化

整个系统的持久化方案朴素得令人意外:一个 JSON 文件。

写入采用 Unix 经典的 "临时文件 + rename"原子操作——先写到 .tmp 文件,fsync 刷盘,再 rename 覆盖目标文件。任何时刻断电或崩溃,你读到的数据都是完整的。

数据加载时会自动执行一套 18 步格式迁移,把各种历史版本的数据统一归一化。所有迁移幂等、无感,老用户升级后数据直接可用,不需要手动跑脚本。

没有 Redis,没有 PostgreSQL,没有 RabbitMQ。对于一个运行在用户本地的 AI 网关来说,这种"够用就好"的选择反而是最务实的架构决策。

14300 行测试的"工程纪律"

最后说一个数字。

这个模块有约 8900 行核心代码,配套的测试代码是 14300 行——测试比实现多了 60%。

61 个测试文件中,有 13 个以上是针对历史 Bug 的专项回归测试。每一个修过的 Bug 都留下了一个测试用例,确保它永远不会复发。

这个比例不是偶然的。能做到测试比代码多,说明每一个设计决策都有验证、每一个边界条件都被覆盖。再加上全套依赖注入(连时间源 nowMs 都可以替换成假时钟),所有定时逻辑都能在测试里瞬间快进验证,不需要真的等 30 分钟。

写在最后

回过头看,OpenClaw 的 Planning 模块做的事情并不"酷炫"——没有大模型推理,没有多智能体博弈,就是一个扎扎实实的任务调度系统。

但它解决了一个真实的问题:
让 Agent 从"你盯着用的工具"变成"替你值班的员工"。

8900 行代码,61 行的对外接口,零外部依赖,14300 行测试。这种克制和纪律,可能才是工程能力的真正体现。

一个开放的问题留给大家:随着 Agent 能力越来越强,这种基础设施层的调度与编排,会不会成为比模型能力本身更关键的竞争壁垒?

 


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅