【发布时间】:2018-02-12 09:21:37
【问题描述】:
我被要求对事件溯源进行一些探索。我的目标是创建一个满足所有传统 CRUD 操作的微型 API 层。我现在正在使用一个名为“sourced”的包并尝试使用它(使用 Nodejs)。
但是,我开始意识到事件溯源在单独使用时并不是很有用。通常,它与 CQRS 相结合。
我对 CQRS 的理解是,当 UI 向服务器发送写入命令时。该应用程序对数据进行了一些验证。并将其保存在事件存储中(我使用的是 mongoDB),例如:这是我的事件存储的样子:
{method:"createAccount",name:"user1", account:1}
{method:"deposit",name:"user1",account: 1 , amount:100}
{method:"deposit",name:"user1",account: 1 , amount:100}
{method:"deposit",name:"user1",account: 1 , amount:100}
{method:"withdraw",name:"user1",account1,amount:250}
它包含所有审计信息,而不是最终状态。 但是,我很困惑如何处理读取操作。如果我想读取账户余额怎么办。究竟会发生什么? 这是我的问题:
- 如果我们不能直接查询事件存储(数据库)进行读取操作,那么我们应该在哪里查询呢?它应该是内存中的缓存吗?
- 如果我们查询内存。是已经存在的最终状态还是我必须进行重放(或左折叠)操作来计算结果。例如,账户 1 的余额为 50。
- 我发现一些博主谈到了“订阅”或“广播”。它们是什么,向谁广播?
我将非常感谢任何建议,如果我的理解有误,请纠正我。
【问题讨论】:
-
对我来说,您在问题中没有意识到的一个概念是事件通常在流中维护,在 DDD 意义上,这些流是按聚合隔离的。在决策过程中考虑的事件序列仅限于您在编写时并置的事件。在查询方面,您可以在某些低负载情况下通过阅读+折叠整个流来破解它。一般来说,正如答案所暗示的,预测是如何实现查询的等价物。 intro docs for GES 很好读
-
@RubenBartelink 是的,你是对的!我不知道如何使用事件流。我应该研究一下流维护的事情。感谢您的建议!
标签: microservices domain-driven-design cqrs event-sourcing