事件溯源——提供给命令的数据和保存在事件中的数据

Event Sourcing - Data supplied to Command and data saved in Events

我正在研究事件溯源,我有一些想法需要全面考虑。

以网店为例-

客户将商品添加到购物车并保存订单。

命令处理程序可以在客户聚合根上创建一个订单,并添加一个包含客户 ID、订单 ID、项目 ID、数量和单价的 OrderCreated 事件。一切都非常简单,但如果聚合需要检查该项目是否有特价怎么办?

例如,如果这是一个购物篮服务,它会从目录服务订阅事件并存储它自己的目录服务的预测,然后它可以使用,那么篮子服务将包括一个事件存储和一些目录服务的投影形式?

或者如果在我刚刚描述的示例中,如果购物车和目录功能是同一应用程序的一部分并且它们只保存事件数据,那么当客户创建订单时,处理程序将从中提取所有订购的商品通过存储库的事件存储,将所有事件应用到它们,然后 return 将它们应用到处理程序,以检查该项目是否特价。

what if the aggregate needed to check to see if that item was on special offer?

它需要执行一个查询来获取它需要的信息。

从聚合的角度来看,这些数据是外部数据,因此它(或向其发送命令的处理程序)需要查询才能访问该信息。

查询如何工作取决于您(每种方式各有利弊),查询处理程序可以:

  • 调用加载聚合的存储库并检查特价商品(您也可以考虑在系统的一部分中使用事件源,并让这部分使用另一种方式存储 dara,或者不使用)
  • 远程调用目录服务API以查看特价商品
  • 对本地数据库进行查询,该数据库填充目录服务发出的读取事件并“本地”存储到购物篮服务