我已经阅读了几篇关于CQRS的博客,并且他们都解释说,在写入端事件持久存储在事件存储中,并且在请求时,事件被检索并在聚合上重放。
我的问题是为什么在阅读方面不需要在聚合上重播事件?
答案 0 :(得分:6)
因为您的阅读方不使用聚合。
读取端实现为投影,它根据聚合发出的事件流计算当前状态,并将当前状态保存在某些持久存储或内存中。读取侧的时间点是为客户提供当前状态。
答案 1 :(得分:1)
我想为Jakub Konecki的解释添加例子。
让我们假设您使用事件来源为银行帐户建模。该帐户的每个操作都会导致事件被持久化。几年后,您有数百个与该银行帐户相关的活动。现在,如果要显示该帐户的余额,您将重播所有事件以计算余额?如果有很多帐户,仅重放事件来计算余额将是应用程序的性能瓶颈。我们甚至不提及从银行帐户显示所需的其他信息,并描述当前的帐户状态。
这就是为什么我们在读取端存储聚合状态的快照,因为主要的读取端用于表示目的。我们希望保持系统的这一部分简单。