如何在事件源应用程序中管理读取请求

时间:2017-09-04 07:07:54

标签: domain-driven-design microservices cqrs event-sourcing event-store

我被要求在事件采购中做一些探索。我的目标是创建一个满足所有传统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. 如果我们无法直接查询事件存储(数据库)进行读取操作,那么我们应该在哪里查询?它应该是内存中的缓存吗?
  2. 如果我们查询内存。已经存在最终状态,或者我必须进行重放(或左折)操作来计算结果。例如,帐户1的余额为50。
  3. 我发现一些博主谈到'订阅'或'广播'。他们是什么,并向谁广播?
  4. 如果有任何建议,我将非常感激,如果我的理解错误,请与我联系。

2 个答案:

答案 0 :(得分:6)

好问题尼克。您缺少的概念是'预测'。当事件持续存在时,您将广播该事件。您的投影代码会侦听特定事件,然后执行更新等操作并创建“阅读模型”。读取模型是结束状态的一个版本(通常是持久的,但可以在内存中完成)。

好处是你可以高度优化这些读取模型以供阅读。告别复杂而低效的连接等。

因为读取模型不是真实的来源,它是专门为阅读而设计的,所以可以在其中进行数据复制。只需确保在收到适当的事件时进行管理。

有关详细信息,请查看以下文章:

希望你发现这些有用。

**图表指的是非正规化,它应该讨论预测。

答案 1 :(得分:3)

您可以查询事件存储。实际的查询方法特定于每个实现,但通常您可以轮询事件或订阅,并在新事件持续存在时得到通知。

事件存储只是写入端的持久性,它保证了写操作的强一致性以及读操作的最终一致性。为了“理解”事件中的某些内容,您需要将这些事件投影到读取模型,然后查询读取模型。例如,您可以将包含每个帐户的当前余额的读取模型作为MongoDB集合。