如何在 asp.net 核心应用程序中加快投影速度?

How can I make projection faster in asp.net core app?

我有两个数据库的网络应用程序:

为了订阅并将数据从 eventstore 添加到 postgres,我使用了这个示例 sample 但是,当我进行创建操作并获得成功结果时,接下来我尝试从 postgres 加载新对象,postgres 没有我的新对象。

如何使“事件从 eventstore 应用到 postgres 更快或同步”?

Event-sourced 系统根据定义在事件存储在事件存储和投影到读取模型之间存在时间滞后。延迟始终存在,除非您在将事件提交到存储时将事件同步应用到 in-memory 读取模型。但这种方法会将您限制为 运行 您的服务作为单个实例,否则,您无法确定 in-memory 状态是否同步。有一些技术可以解决这个问题,但它们相当复杂。

由于您没有描述需要立即获取读取的模型数据,因此很难给出具体的建议,但我有一些提示。

  1. 如果UI需要它,而UI需要新的实体状态,可以return实体状态作为命令处理结果,正如您已经拥有的那样。然后,UI 可以立即显示状态,而无需执行任何查询。

  2. 相同的场景,但你return 将新事件集合到UI。如果 UI 位是用 React 和 Flux 之类的东西构建的,他们很可能已经在那里有了“事件源”(这就是 Flux 的本质),并通过他们的 reducer 应用这些事件,他们可以更新 UI 不查询读取模型。

  3. 如果你知道什么读取模型需要同步(我不能说你有多少),你可以将事件提交位置作为元数据传播到读取模型属性,或仅作为文档 属性。然后,您可以保持 API 调用(基本上是等待),直到读取模型更新位置 属性 等于或大于提交位置。缺点是您只能针对特定的读取模型执行此操作,因此您的命令处理程序需要了解太多关于读取端的信息。

  4. 类似于(3)但是你检查检查点存储位置。如果检查点存储没有使用批处理进行优化,它很快就会越过最后一个事件提交位置,然后你 return 200 OK 给调用者。它比 (3) 更容易一些,因为它只关心订阅检查点,而不关心单读模型,但你需要访问检查点存储。

  5. UI他们得到命令处理后也可以这样做,你需要return最后一个事件的提交位置,他们查询并等待。

我已经在生产环境中看到了上述所有方法,但我的首选解决方案是 (1) 和 (2)。

要使这些工作正常进行,您的命令服务需要 return 向调用者(API 或更多)提供复杂的结果,就像我 done in Eventuous.