返回 S01~S90 教材库
S06 · 总 Day 096教材已备 ≠ 学习已完成

S06:Batch Rebuild 与 Event Replay 的边界

Batch rebuild 从一组版本化快照重新计算目标数据,event replay 则按事件日志重演状态变化;两者都能重建,但依赖、顺序和副作用语义不同。

2026-11-28batchrebuild、eventreplay、statereconstruction

内容类型:预习教材(不代表已完成)
日期:2026-11-28
阶段:P2 · AI Systems Engineering 90
总路线:Day 096 / 360
周次 / 节奏:W1 · 周六可选探索 / 补学
状态:教材已备;学习未完成
主题:batch rebuild、event replay、state reconstruction

一句话定义

Batch rebuild 从一组版本化快照重新计算目标数据,event replay 则按事件日志重演状态变化;两者都能重建,但依赖、顺序和副作用语义不同。

学习目标

  1. 能比较 batch rebuild 与 event replay 的输入、顺序、状态和成本。
  2. 能解释为何 replay 需要确定性处理、版本策略和副作用隔离。
  3. 能判断什么情况下只需重算派生表,什么情况下需要重演状态机。
  4. 能完成一条可选观察;忙碌时仅复习,不制造欠账。

核心知识

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。

最小练习或观察步骤

  1. 任选 S02 的 accepted 事件,把“按文件求总额”视为 batch rebuild。
  2. 再按 event time 逐条 reduce 更新余额或计数,把过程视为 replay。
  3. 插入一条旧事件并重跑,比较两种方式的输出和中间状态。
  4. 假设 reducer v2 改变分类规则,写出“历史版本重演”和“新规则重算”两个结果名。
  5. 若不想编码,只画输入、状态、副作用、输出四栏对比表即可。

常见误区与边界

  • 认为事件日志天然不可变、完整和有序,而没有验证保留与分区规则。
  • replay 时再次调用真实外部工具,产生重复副作用。
  • 用新代码覆盖旧结果,却不标明这是重算视图而非当时事实。
  • 把 batch 与 streaming 看成互斥技术阵营;许多系统组合两者。
  • 周六探索扩展成平台搭建;一条新观察已经足够。

系统场景连接

金融账户余额通常来自有序账务事件,而风险画像可以从事实快照批量重算。AML 决策的历史解释既需要当时状态,也可能需要按新规则回顾分析。Web3 索引器会从区块事件重放状态,但链重组要求撤销或重建一段投影。本日为后续 durable workflow 的 checkpoint、幂等和恢复语义打基础。

自检问题

  1. batch rebuild 和 replay 分别依赖什么最小输入?
  2. 为什么“最新规则重算”不等于“恢复历史当时状态”?
  3. replay 怎样避免重复外部副作用?
  4. 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 结果差异:
  • 需要隔离的副作用:
  • 一个版本兼容问题:
  • 今日是否选择休息:
重点主线 · H01 · 任务契约与上下文架构本周配套机制实验 · W1 · 历史数据:当时发生,不等于当时已知 →详细讲义、离线示例与源码;按需要选读,不新增必交任务。
本页是未来 P2 的预习教材。等 P1 完成并正式进入 P2 后,再填写真实理解、练习结果和不确定项;现在阅读不会改变P1 唯一进度账本