Pull vs Push:OpenClaw 的调度模型与企业级异步任务设计
技术概览
- 技术来源:OpenClaw Gateway 内部架构(Heartbeat / Cron / Subagent / Command Queue)
- 核心概念:Pull-based 定时轮询 vs Push-based 事件回流,两种调度模型的设计取舍
- 关键词:Heartbeat、Cron、Subagent、Command Queue、Session Lane、Compaction
核心问题:为什么调度模型的设计很重要
在任何有"后台任务"的系统里,最核心的设计决策之一就是:谁主动?谁被动? 是系统定期去检查(pull),还是任务完成后主动通知(push)?
OpenClaw 作为一个 AI Agent 运行时,同时面对两类完全不同的调度需求:
- 周期性感知任务:检查邮件、日历、待办、系统健康——不需要精确时间,但需要"定期看看有没有事"
- 异步执行任务:子任务跑完要回执、定时提醒要精确触发、批量操作要结果汇总——需要精确的事件驱动
OpenClaw 用三种机制分别处理了这三类场景,设计上各有深意。
技术架构与设计
一、Heartbeat:Pull-based 定时轮询
机制:Gateway 每隔固定时间(默认 30 分钟)在 main session 中注入一个 agent turn,prompt 固定为:"Read HEARTBEAT.md... If nothing needs attention, reply HEARTBEAT_OK."
设计特点:
- 运行在 main session,拥有完整的对话上下文
- 批量处理:一个 heartbeat 可以同时检查邮件、日历、待办、系统状态
- 智能抑制:如果没需要关注的事,回复 `HEARTBEAT_OK`,不产生用户可见消息
- 支持 activeHours 限制(如 08:00-22:00),夜间静默
- 支持 lightContext 模式(只注入 HEARTBEAT.md,不加载完整对话历史)
- 支持 isolatedSession 模式(每次 heartbeat 用全新 session,无历史负担)
核心价值:用一次 agent turn 的成本,替代 N 个独立轮询任务。模型有全局上下文,能做出智能判断——"这封邮件不急" vs "这个日程 10 分钟后开始必须提醒"。
二、Cron:精确调度 + Session 隔离
机制:标准 cron 表达式 + 时区支持,可选在 main session 或 isolated session 中执行。
设计特点:
- 精确时间:5 字段/6 字段 cron 表达式,支持时区
- 自动分散:整点调度的任务自动在 0-5 分钟窗口内分散,避免 thundering herd
- Session 隔离:isolated session 模式不污染 main 历史,用完即走
- 模型覆盖:可以为单个 job 指定不同的模型(重分析任务用更强模型)
- Delivery 控制:isolated job 默认 `announce`(推送摘要),可选 `none`(静默执行)
- One-shot:`--at` 参数支持一次性定时(如"20 分钟后提醒我")
Cron vs Heartbeat 决策流:
需要精确时间? → Cron
需要隔离? → Cron (isolated)
可批量合并? → Heartbeat
一次性提醒? → Cron (--at)
需要不同模型? → Cron (isolated)
三、Subagent:Push-based 任务委派
机制:主 session 通过 `sessions_spawn` 创建子 session,子任务完成后通过事件自动回流到主 session。
设计特点:
- Push-based 通知:子任务完成后,Gateway 自动将 completion event 推送到主 session
- 禁止轮询:文档明确禁止 `sessions_list` / `sessions_history` 循环查询
- 并行执行:可同时派发多个 subagent,各自独立运行
- 继承工作空间:subagent 自动继承父 session 的 workspace 目录
- 模型覆盖:每个 subagent 可以指定不同模型
核心价值:解决了"我要等一个耗时任务但不想阻塞主会话"的问题。派出去就不管了,跑完了自动回来。
四、Command Queue:消息合并与会话串行化
机制:所有入站消息通过 lane-aware FIFO 队列串行化,支持多种合并模式。
Queue 模式:
- `collect`(默认):合并所有排队消息为一个 followup turn
- `steer`:立即注入当前 run(取消 pending tool calls)
- `followup`:排到下一轮
- `steer-backlog`:steer + 保留到 followup
串行保证:每个 session 同时只有一个 active run(`session:<key>` lane),通过 global lane 限制整体并发(默认 main 4, subagent 8)。
五、Compaction:上下文窗口的自动管理
当 session 接近模型上下文窗口上限时,OpenClaw 自动触发 compaction——将旧对话压缩为摘要,保留最近的消息。压缩后的摘要持久化到 session JSONL 历史中,后续请求使用压缩摘要 + 近期消息。
关键设计:compaction 可以用单独的模型(如用更强的模型做摘要,用更便宜的模型做日常对话)。
关键洞察
🔑 洞察一:Pull 和 Push 不是互斥的,是互补的
OpenClaw 没有选择"全部 pull"或"全部 push",而是按场景选择最合适的模式:
- 场景 | 模式 | 原因
- 定期检查邮件/日历 | Pull (Heartbeat) | 不需要精确时间,可以批量合并
- 每天 9 点发日报 | Push (Cron) | 精确时间,独立执行
- 子任务完成通知 | Push (Subagent) | 事件驱动,禁止轮询
- 20 分钟后提醒 | Push (Cron --at) | 一次性,精确时间
- 多条消息同时到达 | Queue (Collect) | 合并为一个 turn,减少 API 调用
这个设计在企业系统中有直接的映射:
- Pull 模式:定时轮询数据库、定期同步数据、周期性报表生成
- Push 模式:审批流通知、WebSocket 推送、消息队列消费
- Queue 模式:请求合并、防抖、批量处理
🔑 洞察二:Session 串行化是并发安全的关键
OpenClaw 保证每个 session 同时只有一个 active run,这不是限制,而是安全保证。原因:
- 工具执行的副作用:两个 agent 同时修改同一个 session 的文件会产生竞态
- 对话历史一致性:如果两个 run 同时向 session 写入消息,历史顺序会混乱
- 模型上下文完整性:一个 run 的 compaction 不应该影响另一个 run 的上下文
这与数据库的事务隔离级别类似——serializable 是最安全的,虽然牺牲了一些并发度。
🔑 洞察三:智能抑制是系统成熟度的标志
Heartbeat 的 `HEARTBEAT_OK` 抑制机制看似简单,实际上是一个重要的设计模式——系统不应该在"无事发生"时产生噪音。
传统定时任务的痛点:即使没有数据变化,也会产生日志、消耗 API 配额、打扰用户。Heartbeat 的做法是:让模型自己判断"值不值得通知",只有真正需要关注的事情才会触发用户可见的消息。
这在企业系统中有广泛的应用场景:监控告警(只有异常才通知)、报表系统(只有数据异常才推送)、审批流(只有需要操作才提醒)。
引发思考:对薪酬激励系统的启示
薪酬激励研发中的典型调度需求与 OpenClaw 的三种机制有天然的对应关系:
Heartbeat 对应:定期数据巡检——每天定时检查薪酬数据是否异常(如某部门薪资总额突增、某员工奖金计算异常),无异常则静默,有异常才告警。传统的"每小时跑一次全量检查"模式可以通过 heartbeat 的智能抑制优化——让模型判断"这个异常是否值得人工介入"。
Cron 对应:精确时间触发——每月发薪日自动触发薪酬计算、每季度绩效奖金窗口自动打开、每年调薪窗口自动提醒。这些需要精确时间的任务适合 cron 模式,且 isolated session 不污染主会话历史。
Subagent 对应:异步批量操作——批量更新 500 人的薪资数据时,不需要阻塞主流程,派一个 subagent 去跑,跑完了自动通知结果。或者审批流中,某个节点需要等待多方意见,subagent 可以并行收集,完成后 push 回主流程。
Queue 对应:多请求合并——HR 在短时间内连续修改多个员工信息,不应该触发 10 次独立的 API 调用,而是用 collect 模式合并为一个批量操作。
关键原则:不是所有后台任务都需要"实时",但所有后台任务都需要"在正确的时间以正确的方式通知正确的人"。 Pull 做广度覆盖,Push 做精确触达,Queue 做效率优化。
相关阅读
- OpenClaw Heartbeat 文档https://docs.openclaw.ai/gateway/heartbeat — Heartbeat 配置与响应契约
- OpenClaw Cron 文档https://docs.openclaw.ai/automation/cron-jobs — Cron 表达式与 session 模式
- Cron vs Heartbeat 决策指南https://docs.openclaw.ai/automation/cron-vs-heartbeat — 何时用哪个
- Command Queue 设计https://docs.openclaw.ai/concepts/queue — 消息合并与会话串行化
- Agent Loophttps://docs.openclaw.ai/concepts/agent-loop — Agent 运行时生命周期
- Compactionhttps://docs.openclaw.ai/concepts/compaction — 上下文窗口自动管理
- Multi-Agent Routinghttps://docs.openclaw.ai/concepts/multi-agent — 多 Agent 隔离与绑定
*逍遥云初 | 2026.04.03*



