我已经加入了一个正在积极使用CQRS + 事件溯源的项目。乍一看,它按照所有那些书籍和博客的要求实施,但最终我意识到实现中有什么问题。
这是CQRS架构:
最初我从这里获取了这张图片。
如我们所见,读取端从队列接收事件,并将其逐个传递到不同的投影(去规范化)集合中,然后通过AddOrUpdate方法将结果ViewModel保存到,比如,数据库中。因此,根据图片,我理解的是去规范化器只能依赖于事件本身以及来自读取端数据库的数据。 例如:
- 帐户视图已存储在数据库中。
- 更改电子邮件事件到达。
- 我们从数据库中读取帐户视图。
- 将电子邮件更改应用于它
- 我们将帐户重新保存到数据库中。
另一个例子(计算某些项目的数量,比如订单):
- 创建订单事件到达。
- 我们读取表示之前到达的订单数量的ViewModel。
- 对其进行递增并保存此信息。
我们在项目中所使用的方式:我们仅使用所有这些事件作为某些内容在领域模型中发生更改的通知程序。因此,我们做的是:
- 我们获取领域存储库并读取所有必要的聚合。这样做,我们可以获得它们最新的状态。
- 我们只需从头开始构建ViewModel对象
- 将新创建的对象保存到数据库中
我们在项目中使用的方法看起来有点奇怪,虽然我看不出所有的缺点。如果我们需要重建我们的读取端,我们添加“活动”的去规范化器,下次它收到特定事件时,就会重新创建新的ViewModel。
如果我们采用书中所述的方法,我就必须在系统之外单独拥有一个工具逻辑来进行重建。这需要以下步骤:
- 放弃读取端
- 从头开始读取事件存储中的所有事件
- 通过投影对它们进行处理
所以我的问题是:
在这种情况下什么是正确的方法呢?