【问题标题】:CQRS/EventStore Idempotency?CQRS/EventStore 幂等性?
【发布时间】:2020-10-27 18:39:39
【问题描述】:

使用 Jolivers EventStore 在 c# 中实现/处理幂等性。这是否意味着在处理之前只需检查域/读取模型旁边的聚合 ID 和版本?还是还有更多?

[编辑]

我问的原因是,例如,我想以小功能块开发我的应用程序。

所以 - 假设我有一个包含在线商店产品数据的某种类型的数据集。我想通过创建搜索产品的能力来开始开发应用程序。这意味着以某种方式导入数据集(不管如何)。数据集中的每个产品最终都会触发(例如)一个 CreateProductCommand - 此命令通过触发 ProductAddedEvent 的域,然后由非规范化程序处理以填充 ProductSearchView

现在 - 实现搜索功能后,我想创建产品详细信息视图。我已经运行了导入以将数据集导入系统,因此我想重新运行将触发非规范化器以填充 ProductDetailView 的事件

这有意义吗?

【问题讨论】:

  • 你是说不两次处理完全相同的命令吗?

标签: c# domain-driven-design cqrs event-sourcing neventstore


【解决方案1】:

您可以做的是清理读取模型数据存储并使用首次发布时使用的相同机制运行事件存储中的所有事件。

我正在使用一个单独的东西来执行此操作,作为我部署过程中的一个步骤。

使用 Event Store 的一个实例,我从一开始就获取所有事件:

var commits = eventStore.Advanced.GetFrom(DateTime.MinValue).ToList();

然后我遍历列表并将事件分派到读取模型,使用的代码与我通常分派时使用的大部分代码相同。

基本上就是这样。

你应该做的是创造一些让你变得简单的东西,因为你将不得不做很多事情。

【讨论】:

  • 我可以启动一个新的 raven 实例,流式传输到该实例,然后切换我猜?
  • 这不是“理想的” - 我想在处理新东西的同时重播事件而不是搞砸现有数据会是理想的
  • 现有数据在事件存储中。只要您保持原样,您就可以对读取模型做任何您想做的事情。
  • 我是 cqrs 世界的新手,但这种方法看起来有一些缺点。特别是在非常大的应用程序上(就事件数量而言)。重建完整的读取模型可能需要一段时间。应用程序不可用的时间窗口。为了解决这个问题,我只能看到一种解决方案:在所有前端节点上复制读取模型,而不是只为场保留一个读取模型。你觉得我说的对吗?
  • 您还可以在新的单独读取模型上运行重播,然后在完成后切换到该模型。您可以在重建时保持系统运行,并且在进行切换时,您只需确保还获取自单独重放开始以来您错过的事件。这样您就可以几乎没有停机时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多