@levinzhang
2018-02-19T07:05:57.000000Z
字数 1610
阅读 528
by
当Thomas Pierrain与一家资产管理公司开始一个新项目的时候,其中有一项重要的需求就是能够回到过去,理解当时为什么会做出一些现在看起来很奇怪决策。在最近于阿姆斯特丹举行的DDD Europe 2018上,Pierrain讨论了他构建事件溯源系统的经历以及所面临的挑战。
当 Thomas Pierrain与一家资产管理公司开始一个新项目的时候,其中有一项重要的需求就是能够回到过去,理解当时为什么会做出一些现在看起来很奇怪决策。在最近于阿姆斯特丹举行的DDD Europe 2018上,Pierrain讨论了他构建事件溯源系统的经历以及所面临的挑战。
这家公司想要构建的系统需要能够提供整个公司业务相关的信息。详细的需求包括能够生成过去特定日期的报告、通过添加回溯(retroactive)事件改变过去的行为以及调度未来的事件。
在开始的时候,42skillz的咨询师Pierrain和他的同事在把握业务需求方面遇到了不少的困难,所以他们召开了多次会议和workshop以理解领域、需求以及他们真正想要什么。改变过往的原因在于在某些事情发生之后,业务有了新的发现,所以必须要通过添加回溯事件改变他们对世界的认识。调度未来事件的原因在于他们能够知道未来将要实际发生的事件,而他们不想像以前那样错过这些事件。
对于Pierrain来说,这个系统采用基于事件溯源(event sourcing)的技术是很合适的选择。但是,改变过往和事件调度的需求让他对这个技术决策产生了怀疑。因此,他咨询了事件溯源社区,来自社区的响应,包括Greg Young的响应,都显示他的决策是正确的。Young还引用了一篇他在2014年所撰写的博客文章:Event Sourcing and Post/Pre Dated Transactions。
要使用过往的事件,可以根据需求采用三种投射模型(projections mode):
回溯事件有两个日期,一个用于表述事情发生的日期(实际日期),一个用于表述它记录的日期。要生成过往的报告,必须要考虑事件的这两个日期。对于他的需求而言,Pierrain用到了两个术语:
这意味着如果我们要站在2017年7月1日的视角上,为2017年6月1日生成一份报告的话,将要使用实际日期为6月1日的事件,以及记录时间不晚于2017年7月1日的事件。举例来讲,MoneyAdded事件代表了特定日期为某个账号增加钱数的事件。要使用之前的日期生成报告,需要使用如下的逻辑:
在创建回溯事件的时候,团队决定采用命令(command)的方式进行创建,因为这些事件有一些必须要执行的业务逻辑,不过Pierrain指出,在有些场景下,直接创建事件的做法可能会更好一些。对于未来事件的解决方案是调度一条能够创建事件的命令。
早在2005年,Martin Fowler就写过一篇关于临时(Temporal)模式的文章,该文描述了Pierrain所经历的相同问题。
DDD Europe 2019的计划已经启动,但是具体的日期尚未确定。
查看英文原文:Retroactive and Future Events in an Event Sourced System