Cqrs EventStore:学习如何使用

Cqrs EventStore:学习如何使用,cqrs,event-sourcing,neventstore,Cqrs,Event Sourcing,Neventstore,我正在努力学习EventStore,我喜欢这个概念,但当我尝试在实践中应用时,我也陷入了同样的困境。 让我们看看代码: foreach (var k in stream.CommittedEvents) { //handling events } 关于这一点,有两个问题: 当一个应用程序在维护后启动时,我们如何在 安全方式什么事件开始读取?有一种模式可以使用吗 一旦所有事件都被消耗掉,周期就结束了。。。运行时到达的消息如何?我希望在一些新消息到达之前(当然需要在线程中处理)或具有类似

我正在努力学习EventStore,我喜欢这个概念,但当我尝试在实践中应用时,我也陷入了同样的困境。 让我们看看代码:

foreach (var k in stream.CommittedEvents)
{ 
   //handling events
}
关于这一点,有两个问题:

  • 当一个应用程序在维护后启动时,我们如何在 安全方式什么事件开始读取?有一种模式可以使用吗

  • 一旦所有事件都被消耗掉,周期就结束了。。。运行时到达的消息如何?我希望在一些新消息到达之前(当然需要在线程中处理)或具有类似BeginRead和EndRead的内容时调用才会被阻塞

我是否必须绑定ESB来处理运行时事件,或者EventSore是否提供了一些工具来实现这一点

我试着用一个例子来更好地解释 假设集合是一个金融投资组合,应用程序是一个向交易者显示该投资组合的应用程序。假设交易者连接到web应用程序并查看自己的投资组合。当前状态将是整个历史,因此我必须读取大量记录才能重现状态。我想这可以通过所谓的快照来完成,但谁负责创建快照呢?何时应该选择创建聚合?如何猜测聚合的快照存在? 对于运行时部分:用户一看到重构的公文包状态,实时部分就开始运行。用户可以下订单,并且可以通过在市场上成功执行该订单来创建新的头寸。基础设施如何更新投资组合?我会期望,但可能我完全错了,有相同的事件流作为新事件的源新长位置,否则我有两条路径处理相同聚合的状态。我想知道这是否就是策略应该如何运作的,即使我觉得有两个州代理有点棘手,这可能会重叠。 我只是想澄清一下我是如何害怕重叠的:

  • 我知道事件必须是幂等的,所以我知道它不能是 问题是
  • 但是让我们考虑一下:
在流式传输事件之前,我订阅了一个事件总线,以更新投资组合的状态。一些“未平仓事件”出现在总线上:我必须处理它们,但可能投资组合没有处于正确的状态来处理它,因为它尚未实现。即使我能够处理这些事件,我也会在阅读流时再次找到它们

更阴险的是:我打开流,读取所有事件,然后创建一个状态。然后,我订阅了总线:总线上的一些消息发生在STARAM读取结束和订阅订阅之间的中间:这些事件丢失,聚合不在正确的状态。 请大家耐心点,我的英语很差,争论也很棘手,希望我能说出我的疑问:)

当前状态将是整个历史,所以我必须阅读 可能需要大量记录来重现状态。我猜是这样 可以通过所谓的快照来完成,但谁负责 创造它

在CQR和事件源中,查询由聚合发出的事件生成。您不使用从事件存储中重构的聚合实例来显示信息

术语快照特别指事件存储的优化,它允许在不重播所有事件的情况下重建聚合

投影本质上是维护聚合的非规范化视图的事件处理程序。从聚合发出的事件被发布,可能是带外的,投影订阅并处理这些事件。例如,如果存在显示摘要信息的需求,则投影可以组合多个聚合。对于交易应用程序,每个视图通常包含来自各种聚合的数据。预测是以消费者驱动的方式设计的——应用程序需求决定了所需底层数据的不同视图

使用这种类型的工作流,您必须在整个应用程序中实现最终的一致性。例如,如果最终用户正在查看他们的投资组合并开始新的交易,UI必须订阅更新以异步方式反映更新的预测


查看CQR和活动来源概述。

我不完全理解这些问题。例如,为什么要将阅读事件的起点“添加书签”?还有,你所说的“一旦所有事件都被消耗掉”是什么意思?您是否可以提供有关您的场景的更多信息?@eulerfx我集成了问题+1我看到了一些CQRS示例,其中eventHandler负责将聚合状态存储在存储上(假设为SQL数据库)。您说过投影可以被视为事件处理程序,因此将负责在DB上存储,因此我不会为每个事件设置事件处理程序,因为所有事件都由投影处理。这是正确的吗?可以通过处理多个事件(捕获所需状态更改所需的所有事件)来实现投影。从这个意义上讲,有多个事件处理程序,但如果您需要的话,这可能不一定转化为多个类。