知识卡片
状态与流互为积分微分的关系,及不可变事件的优点
内容
可变状态与不可变事件的仅追加日志并不矛盾,而是一体两面:只要状态发生了变化,这个状态就是一段时间内事件累积作用的结果(当前可用座位、账户余额,都是已处理事件的产物)。用数学语言说,应用当前状态是事件流对时间求积分的结果,而变更流是状态对时间求微分的结果——这个比喻的实用价值在于:如果你持久保存了变更日志,重现状态就变得非常直接,日志才是”真相”,数据库不过是日志中每条记录最新值的缓存(这也是[[变更数据捕获的实现方式与日志压缩机制]]中日志压缩机制的理论根基——它只保留每条记录的最新版本,正是”缓存”这层含义的具体实现)。不可变事件日志相比可变数据库有实打实的优点:会计记账几个世纪以来的做法——发现错误不删除或修改分类账里的错误交易,而是添加一笔补偿交易,错误的痕迹永远留存以便审计——正是这种不变性思路的先例;对软件系统而言,不可变的仅追加日志让诊断问题、从代码bug中恢复远比”数据被破坏性覆写后难以挽回”要容易得多;不可变事件还保留了比当前状态更多的信息(比如顾客把商品加入购物车又移除,这个”考虑过又反悔”的信号对分析很有价值,但在只存当前状态的数据库里这个信息在移除时就永久丢失了)。
参考来源
- 位置:《数据密集型应用系统设计》第十一章《流处理》"状态、流和不变性""不可变事件的优点"(源文件:_epub-src/ch11_split_001.html)
- 结论依据:原文用积分微分的数学类比说明状态与事件流的关系,引用"日志是真相、数据库是日志缓存"的表述,并以会计记账用补偿交易而非删除修改错误交易为例说明不可变事件带来的可审计性与故障恢复优势,直接支撑本卡片结论。
- 原始内容:应用状态是事件流对时间求积分得到的结果,而变更流是状态对时间求微分的结果……日志才是真相,数据库是日志子集的缓存……如果发生错误,会计师不会删除或更改分类帐中的错误交易,而是添加另一笔交易以补偿错误。