事件溯源:内存读取模型,在读取期间应用事件是否有意义?
Event sourcing: in-memory read model, does it make sense to apply events during read?
我正在开发一个使用事件源来存储数据的应用程序。由于多种原因,未使用持久化读取模型,因此我们需要实现内存中读取方法。
我们的想法是,聚合中的一些数据应该用当前日期读取,但也应该用过去的日期读取。因此,我正在考虑的方法是处理该聚合的所有事件和 Apply
聚合中的事件,以便在指定日期获得状态。
但是,我在各种文章中读到 Apply
方法只应在命令发出时使用,而不应在读取阶段使用。
在阅读阶段使用Apply
方法有意义吗?或者也许应该用不同的方法(某种处理器)复制相同的逻辑?
我不会在这里发布任何代码,因为我正在寻找的是了解正确的方法应该是什么,并更好地了解如何使用事件溯源。
应避免读取聚合的 internal 和 private 状态,因为这会破坏它的封装。此外,聚合存储它需要的任何状态以检查其不变量,查询该状态将强制聚合维护它不需要的其他状态。
总之,避免读取写入端。
我认为 Apply
方法不一定只在发出事件时调用。如果 Apply
方法的目的是 将事件加载 到聚合中,那么在将聚合恢复到其当前状态时将调用它。
似乎您需要处理在某些 window 期间(start/end 日期)内代表它的聚合。 可能创建一个表示您感兴趣的位的读取模型并将它们存储为时间敏感数据然后查询那个[=25]更合适=].
如果处理过于密集,您甚至可能想要发出一个命令,该命令请求一份报告或某种视图,但那会仍然 通过时间敏感的读取模型工作,然后生成所需的输出。完成后,可以通知用户结果已准备好供阅读。
正如@Constantin Galbenu 所说:您应该避免聚合的内部状态,这与不查询域模型有关。
我正在开发一个使用事件源来存储数据的应用程序。由于多种原因,未使用持久化读取模型,因此我们需要实现内存中读取方法。
我们的想法是,聚合中的一些数据应该用当前日期读取,但也应该用过去的日期读取。因此,我正在考虑的方法是处理该聚合的所有事件和 Apply
聚合中的事件,以便在指定日期获得状态。
但是,我在各种文章中读到 Apply
方法只应在命令发出时使用,而不应在读取阶段使用。
在阅读阶段使用Apply
方法有意义吗?或者也许应该用不同的方法(某种处理器)复制相同的逻辑?
我不会在这里发布任何代码,因为我正在寻找的是了解正确的方法应该是什么,并更好地了解如何使用事件溯源。
应避免读取聚合的 internal 和 private 状态,因为这会破坏它的封装。此外,聚合存储它需要的任何状态以检查其不变量,查询该状态将强制聚合维护它不需要的其他状态。
总之,避免读取写入端。
我认为 Apply
方法不一定只在发出事件时调用。如果 Apply
方法的目的是 将事件加载 到聚合中,那么在将聚合恢复到其当前状态时将调用它。
似乎您需要处理在某些 window 期间(start/end 日期)内代表它的聚合。 可能创建一个表示您感兴趣的位的读取模型并将它们存储为时间敏感数据然后查询那个[=25]更合适=].
如果处理过于密集,您甚至可能想要发出一个命令,该命令请求一份报告或某种视图,但那会仍然 通过时间敏感的读取模型工作,然后生成所需的输出。完成后,可以通知用户结果已准备好供阅读。
正如@Constantin Galbenu 所说:您应该避免聚合的内部状态,这与不查询域模型有关。