知识卡片
事件溯源:用存储换不可变性,只存事务不存状态
内容
[[不可变性是并发问题的根治方案与可变性隔离策略]]提出的问题——不可变性是否实际可行——随着存储和处理能力大幅进步有了新答案:以银行账户余额为例,如果不保存具体余额、只保存完整事务日志,查询余额时把全部交易记录取出、从头累计一遍即可,这样就完全不需要维护任何可变变量,代价是随时间推移事务数目无限增长、每次累计所需的处理能力最终会变得不可接受——除非拥有无限存储和无限处理能力。但书中的关键洞察是:我们未必需要这个设计”永远”可行,只需要它在程序的整个生命周期内可行即可,而如今1TB存储已经不算什么——这就是事件溯源:只存储事务记录、不存储具体状态,需要具体状态时从头计算所有事务。这种存储模式最重要的推论是:应用不再是CRUD(增删改查),而是CR(只增只查)——更新和删除操作不复存在,自然也就没有并发问题需要处理。如果存储量和处理能力足够,应用完全可以用纯函数式、彻底不可变的方式来编程。这个思路并不玄乎——源代码版本管理工具(如Git)正是用这种方式工作的:从不真正”修改”文件,而是不断追加新的提交记录,需要某个版本的状态时,从提交历史重新计算出来。
参考来源
- 位置:《架构整洁之道》第6章《函数式编程》"事件溯源"(源文件:_epub-src/text/part0011_split_004.html)
- 结论依据:原文用银行账户余额只存事务日志、查询时从头累计的例子引出事件溯源概念,说明这种模式下应用变为CR而非CRUD、因而没有并发问题,并以源代码管理工具为例说明这种"只追加不修改"的模式已被广泛实践,直接支撑本卡片结论。
- 原始内容:这就是事件溯源,在这种体系下,我们只存储事务记录,不存储具体状态……我们的应用程序不是CRUD,而是CR……我们现在用的源代码管理程序,它们正是用这种方式工作的!