
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在进行软件编程的时候,为了能够在后期方便监控软件的运行状态,通常会在软件中添加日志功能。而同样的,有些公司为了能够保障公司良性发展,也会在做出决策的时候进行记录来方便后期回溯。下面我们就一起来了解一下具体原因吧。
当 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):
“as at”用于特定日期的结果;
“as of”用于特定日期的结果,但是还要考虑到随后的事件可能也要应用回溯;
“as of until”用于特定日期的结果,但是还要考虑到随后的事件可能也要应用回溯,这样的事件会追溯到某个特定的日期截止,在此之后的事件不再考虑。
回溯事件有两个日期,一个用于表述事情发生的日期(实际日期),一个用于表述它记录的日期。要生成过往的报告,必须要考虑事件的这两个日期。对于他的需求而言,Pierrain用到了两个术语:
Viewpoint日期:世界在某个特定时间的状态,采用的是“as of until”模式;
Projection日期:指的是报告的日期。
这意味着如果我们要站在2017年7月1日的视角上,为2017年6月1日生成一份报告的话,将要使用实际日期为6月1日的事件,以及记录时间不晚于2017年7月1日的事件。举例来讲,MoneyAdded事件代表了特定日期为某个账号增加钱数的事件。要使用之前的日期生成报告,需要使用如下的逻辑:
添加实际日期和记录日期为6月1日的事件;
实际日期和记录日期为6月2日的事件不能添加;
添加实际日期为6月1日且记录日期为7月1日的事件;
实际日期为6月1日且记录日期为7月2日的事件不能添加。
在创建回溯事件的时候,团队决定采用命令(command)的方式进行创建,因为这些事件有一些必须要执行的业务逻辑,不过Pierrain指出,在有些场景下,直接创建事件的做法可能会更好一些。对于未来事件的解决方案是调度一条能够创建事件的命令。
作者:Jan Stenberg
译者:张卫滨
来源:infoq
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。