【问题标题】:EventStore: learning how to useEventStore:学习如何使用
【发布时间】:2012-12-11 15:35:00
【问题描述】:

我正在尝试学习 EventStore,我喜欢这个概念,但是当我尝试在实践中应用时,我陷入了同一点。 我们来看代码:

foreach (var k in stream.CommittedEvents)
{ 
   //handling events
}

关于那个的两个问题:

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

  • 一旦事件全部消耗完,循环就结束了……消息到达运行时间呢?我希望呼叫阻塞,直到一些新消息到达(当然需要在线程中处理)或有类似 BeginRead EndRead 的东西。

我是否必须绑定 ESB 来处理运行时事件,或者 EventSore 是否提供了一些工具来执行此操作?

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

  • 我知道事件必须是幂等的,所以我知道它不能是 还是有问题,
  • 但让我们考虑以下几点:

我订阅了一个事件总线流式传输事件以更新投资组合的状态。公共汽车上出现了一些“未平仓事件”:我必须处理它们,但由于尚未实现,投资组合可能未处于处理它的正确状态。即使我能够处理此类事件,我也会在阅读流时再次找到它们。

更阴险:我打开流并读取所有事件并创建一个状态。然后我订阅总线:总线上的一些消息发生在 steram 读取结束和订阅开始之间的中间:这些事件丢失并且聚合未处于正确状态。

请大家耐心等待,我的英语很差,而且争论很棘手,希望我设法分享我的疑问:)

【问题讨论】:

  • 我不完全理解这些问题。例如,为什么要为阅读事件的起点“添加书签”?另外,“一旦事件全部消耗”是什么意思?你能提供更多关于你的场景的信息吗?
  • @eulerfx 我整合了问题

标签: cqrs event-sourcing neventstore


【解决方案1】:

当前状态将是整个历史,所以我必须阅读 可能有很多记录来重现状态。我猜这个 可以通过所谓的快照来完成,但谁负责 创建它?

在 CQRS 和事件溯源中,查询由 projections 提供服务,这些查询由聚合发出的事件生成。您不使用从事件存储重构的聚合实例来显示信息。

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

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

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

查看here,了解 CQRS 和事件溯源的概述。

【讨论】:

  • +1 我见过一些 CQRS 示例,其中 eventHandler 负责将聚合的状态存储在存储上(假设是一个 SQL 数据库)。您说过可以将投影视为事件处理程序,因此将负责存储在数据库中,因此我不会为每个事件设置事件处理程序,因为所有事件都由投影处理。对吗?
  • 可以通过处理多个事件来实现投影——所有事件都需要捕获所需的状态变化。从这个意义上说,有多个事件处理程序,但如果这就是您所要求的,这可能不一定会转换为多个类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2012-05-25
  • 1970-01-01
  • 2021-09-22
  • 2023-03-12
相关资源
最近更新 更多