S06:Batch Rebuild 与 Event Replay 的边界
Batch rebuild 从一组版本化快照重新计算目标数据,event replay 则按事件日志重演状态变化;两者都能重建,但依赖、顺序和副作用语义不同。
内容类型:预习教材(不代表已完成)
日期:2026-11-28
阶段:P2 · AI Systems Engineering 90
总路线:Day 096 / 360
周次 / 节奏:W1 · 周六可选探索 / 补学
状态:教材已备;学习未完成
主题:batch rebuild、event replay、state reconstruction
一句话定义
Batch rebuild 从一组版本化快照重新计算目标数据,event replay 则按事件日志重演状态变化;两者都能重建,但依赖、顺序和副作用语义不同。
学习目标
- 能比较 batch rebuild 与 event replay 的输入、顺序、状态和成本。
- 能解释为何 replay 需要确定性处理、版本策略和副作用隔离。
- 能判断什么情况下只需重算派生表,什么情况下需要重演状态机。
- 能完成一条可选观察;忙碌时仅复习,不制造欠账。
核心知识
Batch rebuild 通常读取一个或多个完整/增量快照,以当前或指定版本逻辑重新生成派生数据。它适合可从事实表重算的特征、统计与索引。Event replay 读取不可变事件序列,按稳定顺序重新驱动投影或状态机,适合需要保留业务变化过程的系统。
二者都要求输入可定位、变换版本可选择和输出可区分。batch 的挑战是扫描成本、快照一致性与大范围替换;replay 的挑战是顺序、重复、旧事件兼容和外部副作用。对一个已经发送短信或执行支付的事件,重放绝不能再次产生真实动作;应把纯状态投影和副作用执行分开,或在安全沙箱中重建。
“用最新代码重放全部历史”不一定得到历史真值,因为旧事件的 schema 和当时规则不同。系统可选择按历史版本重演,或用新版本重算一个明确标记的新视图。两种结果回答不同问题,不应覆盖彼此。
机制与推导
Batch 重建可表示为:
[ View_v=F_v(Snapshot_{t_0:t_1}) ]
事件重放则是递推:state_i = reduce_v(state_(i-1), event_i)。若 reducer 确定且事件顺序稳定,同一初态和版本可得到相同终态。实际系统还会遇到事件重复、分区间无全序、旧 schema 升级及 reducer 缺陷,因此“可重放”是一组约束,不是保留日志就自动获得的性质。
容量上,batch 主要消耗扫描与重算资源;replay 消耗日志保留、状态恢复时间和版本兼容维护。恢复点可通过 snapshot/checkpoint 缩短 replay,但又要证明快照对应到哪个事件 offset。
最小练习或观察步骤
- 任选 S02 的 accepted 事件,把“按文件求总额”视为 batch rebuild。
- 再按 event time 逐条
reduce更新余额或计数,把过程视为 replay。 - 插入一条旧事件并重跑,比较两种方式的输出和中间状态。
- 假设 reducer v2 改变分类规则,写出“历史版本重演”和“新规则重算”两个结果名。
- 若不想编码,只画输入、状态、副作用、输出四栏对比表即可。
常见误区与边界
- 认为事件日志天然不可变、完整和有序,而没有验证保留与分区规则。
- replay 时再次调用真实外部工具,产生重复副作用。
- 用新代码覆盖旧结果,却不标明这是重算视图而非当时事实。
- 把 batch 与 streaming 看成互斥技术阵营;许多系统组合两者。
- 周六探索扩展成平台搭建;一条新观察已经足够。
系统场景连接
金融账户余额通常来自有序账务事件,而风险画像可以从事实快照批量重算。AML 决策的历史解释既需要当时状态,也可能需要按新规则回顾分析。Web3 索引器会从区块事件重放状态,但链重组要求撤销或重建一段投影。本日为后续 durable workflow 的 checkpoint、幂等和恢复语义打基础。
自检问题
- batch rebuild 和 replay 分别依赖什么最小输入?
- 为什么“最新规则重算”不等于“恢复历史当时状态”?
- replay 怎样避免重复外部副作用?
- checkpoint 与 event offset 必须建立什么关系?
专业课程对齐
- 阅读 MIT 6.5840 Distributed Systems 中 fault tolerance、state machine 与日志复制的课程地图,只抓住“按序操作重建状态”的思想,不要求完成实验。
- 阅读 OpenLineage 官方文档 的 run 与 dataset 模型,将每次 batch rebuild 视为新 run,观察输入和输出版本如何保留。
- 阅读 Full Stack Deep Learning 2022 的 data management/infrastructure 内容,思考训练数据重建需要固定哪些输入和代码版本。
深入学习提示
精读时始终把“纯计算”和“有副作用动作”分开。写出一个 reducer 的数学状态转移,再列出破坏确定性的因素:当前时间、随机数、外部 API、非稳定排序。随后比较两类诉求:恢复当时服务状态与用新逻辑重新分析历史。只有先说清问题,才能选择 batch、replay 或两者组合。
学后填写区
- 我选择的重建对象:
- batch 与 replay 结果差异:
- 需要隔离的副作用:
- 一个版本兼容问题:
- 今日是否选择休息: