跳到正文

状态机

云沙箱并不只有“运行”和“停止”两种状态。它会依次经历四个状态,而状态之间的差别会直接反映在费用上。

应当把沙箱生命周期看作一台状态机。听起来很复杂,其实只需要四个状态、两个计时器和一个活动跟踪器。任何一块缺失或实现错误,往往都会在月底的账单上暴露出来。

学习成果

你将能够说出四个状态,解释两类超时如何推动沙箱在状态之间切换,并判断活动跟踪器应该计入或忽略哪些事件。

四种状态

provisioning -> active -> hibernating -> hibernated
                  ^             |
                  +-------------+ (restore)
状态发生的事情成本
配置中VM 正在启动并安装依赖已开始计费
活动Agent 正在工作:运行命令、修改文件全额按分钟计费
正在休眠正在创建快照,沙箱即将结束运行全额按分钟计费
已休眠VM 已停止,快照已保存仅产生存储费用

“活动”是成本最高的状态,“已休眠”则最便宜。中间的两个过渡状态(配置中和正在休眠)虽然持续时间不长,却仍按全额计费,因此应尽量缩短它们。

两类超时

每个云沙箱都有两个时钟。它们因不同原因到期,而你只能控制其中一个。

硬到期

服务商会设定最长生命周期,具体可能是一到四小时。时钟归零后,无论 VM 正在做什么都会被终止,而且你无法延长这一期限。你只能在到期前完成任务,或提前创建快照。

无活动窗口

无活动窗口由你设置。连续 N 分钟没有活动后,沙箱会进入休眠。对大多数 Agent 工作负载来说,五分钟是合理默认值;两分钟比较激进,沙箱可能在两个回合之间休眠;二十分钟则较宽松,但你需要为空闲时间付费。

ts
const INACTIVITY_WINDOW = 5 * 60 * 1000;

硬到期决定最坏情况,无活动窗口决定日常成本,两者都必须正确处理。

哪些事件算作活动

活动跟踪器是无活动窗口正常工作的关键。实现方法很简单:每个“真实”活动都更新时间戳。难点在于界定哪些事件才算真实活动:

事件算作活动?
用户发送聊天消息
执行工具调用
沙箱事件(文件写入、进程启动)
状态轮询
重连探测
健康检查

如果把状态轮询算作活动,沙箱将永远无法休眠,你会一直为空闲时间付费。如果工具调用反而不算活动,沙箱可能在任务执行过程中休眠,导致进行中的工作丢失。这两种失效模式都很常见。

沿时间线分析

0:00  User sends message, sandbox is provisioned
0:02  Sandbox active, agent starts working
0:05  Agent runs npm install (3 minutes)
0:08  Agent finishes, responds to user
0:13  Inactivity window expires (5 min since last activity)
0:13  Sandbox starts hibernating, snapshot in progress
0:14  Snapshot complete, sandbox hibernated
0:20  User sends another message, sandbox restores from snapshot
0:21  Sandbox active again, agent continues where it left off
1:30  Hard expiry hits, VM is killed

针对这条时间线,有两个问题值得回答:

  1. Harness 应该在什么时候提醒用户硬到期即将到来?
  2. 自动快照应在何时触发,以便用户在过期后继续使用?

答案取决于平台的存储费用,以及强制到期会在多大程度上打断 Agent 任务。这里没有唯一正确答案,但有明显错误的选择(什么都不做),也有较好的选择(在硬到期进度达到 80% 时自动创建快照)。

动手试试

这是一节概念课。请自我检查:

  1. 凭记忆画出状态机,并标记每个过渡点
  2. 用一句话解释为什么硬到期不能延长
  3. 从活动表中选一个事件,解释为什么它算或不算

如果你已经在模块 4 接入生命周期钩子,那么构建真正的云后端时,就有位置挂接状态、lastActivityAthardExpiryAt。本地后端与 just-bash 后端不会真的触发这些超时,但整体结构已经确定。

提交

本课没有代码提交。本地沙箱暂时没有值得跟踪的真实超时。

完成标准

  • [ ] 你可以按顺序说出这四个状态
  • [ ] 你可以描述硬到期和无活动窗口之间的区别
  • [ ] 你可以区分哪些算作活动,哪些算作噪音
  • [ ] 你可以沿着上面的时间线追溯,并解释自动快照何时触发

非官方简体中文翻译 · 原课程来自 Vercel Academy