01 - 为什么需要持久化执行
前置:不需要。
本篇回答:为什么「挂了重跑」在生产上不可行、检查点该在什么时机写、幂等键该怎么设计、以及什么场景不需要这套机制。
本篇会用到的词:
| 词 | 意思 |
|---|---|
| 检查点 | 把执行到某一步的状态存到进程外,崩溃后据此恢复 |
| 副作用 | 代码对外部世界造成的、重跑无法抵消的改变。本篇那个 30 步任务里有三步是这种 |
| 幂等键 | 随请求一起发给下游、让它去重的那个确定性字符串。崩溃窗口消不掉,只能靠它让重跑变得无害 |
| 序列化 | 把内存里的对象转成能存进数据库的字节。数据库连接、HTTP client、闭包这些都序列化不了 —— 这是自己手搓检查点时的第二个坑 |
| 全量快照 / 增量 | 每步存整份状态,还是只存变化的部分。前者写入量随步数平方增长,后者恢复时要回放 |
| 挂起 | 任务停下来等外部事件(等用户回复、等审批),可能持续几天。好的实现挂起时不占用任何进程 |
一、一个具体的翻车现场
一个市场调研 Agent,任务是"分析五家竞品,写一份报告",执行过程约 30 步:
红色的三步有不可撤销的外部副作用,这是后面所有讨论的前提。
跑到第 18 步时,K8s 滚动更新把 Pod 干掉了。
1.1 从头重跑的三个后果
| 后果 | 性质 | 说明 |
|---|---|---|
| 前 17 步的模型费用重复支付 | 成本 | 任务花 3 美元,现在要花 6 美元 |
| 用户已等 12 分钟,要再等 20 分钟 | 体验 | 长任务尤其致命 |
| 第 21 步的通知会发第二遍 | 正确性 | 若在第 25 步再挂,群里收到两条进度通知;若崩在第 30 步之后,用户收到两封报告邮件 |
前两个是钱和体验,第三个是正确性问题 —— 系统对外产生了不该产生的行为。