一. 什么是Event Sourcing?
一个对象从创建开始到消亡会经历很多事件,以前我们是在每次对象参与完一个业务动作后把对象的最新状态持久化保存到数据库中,也就是说我们的数据库中的数据是反映了对象的当前最新的状态。而事件溯源则相反,不是保存对象的最新状态,而是保存这个对象所经历的每个事件,所有的由对象产生的事件会按照时间先后顺序有序的存放在数据库中。可以看出,事件溯源的这种做法是更符合事实观的,因为它完整的描述了对象的整个生命周期过程中所经历的所有事件。
事件溯源是把应用程序的所有变动都保存在一个事件序列。我们不仅可以查询这些事件,还可以通过事件日志重新构建过去任何时候的状态,并自动调整状态来应对追溯过的变化。使用事件溯源后,最显而易见的成果就是我们掌握了所有活动的轨迹。事件溯源的关键是要确领域对象的所有变化都由事件对象触发。这样基于事件日志可以建立很多机制:
• 完全重建:可以完全不理会应用现在的状态,因为我们可以在空应用上运行事件日志中的事件来重现应用的当前状态。
• 时态查询:我们可以查看任何时间点的系统状态,可以通过从空白状态重新运行事件直到特定的时间点或事件来实现。进一步可以使用多个时间线(类似于版本控制中的分支)。
• 事件回放:如果我们发现过去某个事件有问题,我们可以回到这个事件点,然后重播正确事件和后续事件。(或者直接忽略系统状态,按顺序重放所有事件和正确事件。)类似的技术可以处理错误顺序的事件流,这是异步消息通信的系统常见的问题。
那么,事件到底如何影响一个领域对象的状态的呢?很简单,当我们在触发某个领域对象的某个行为时,该领域对象会先产生一个事件,然后该对象自己响应