首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NEventStore: Sagas,命令,而不是失去它们

NEventStore: Sagas,命令,而不是失去它们
EN

Stack Overflow用户
提问于 2015-02-09 10:23:29
回答 2查看 1K关注 0票数 2

NEventStore: 5.1

简单设置: WebApp (Asp.NET 4.5) ==命令端

我正在寻找不丢失命令的“正确”方式,关注sagas/process,它可能会没完没了地等待从实际上从未处理过的命令中产生的事件。

老调度员

我最初使用的是同步命令,但出于对sagas/process-managers的关注,我认为首先存储它们,然后通过SyncDispatcher (或AsyncDispatcher)将它们保存起来会更安全。否则,这就是我所担心的,如果一个传奇试图发送一个命令,但由于app-crash/powerloss/...,命令没有完成,那么它就会丢失,而没有人会知道

因此,我创建了一个command-stream,并将每个命令附加到该命令中。如果已经处理了该命令,IsDispatched就会显示出来。

起作用了。

PollingClient和命令流

现在调度员已经过时了,我转而使用PollingClient.我丢失的是Dispatched信息。

出现了一个启动问题:

我天真地从当前最新的检查点开始轮询,但是当应用程序重新启动时,有可能命令在崩溃之前被存储,但没有执行,因此丢失了命令(这是实际发生的)。

我刚看到了idea

将命令的基本结果作为(非域-)事件存储在另一个流中。

这个流将包含CommandSucceededCommandFailed事件。

每当应用程序启动时,都会提取最新的命令id或命令检查点号,用于在该命令之后加载命令.

问题

  • 我的担心,同步命令处理导致失去一个传奇生成的命令的危险,错了吗?如果是,为什么?
  • 这通常是个好主意吗:一个大命令流?
  • 这通常是个好主意吗:将一般的命令-结果-事件存储在流中?
EN

回答 2

Stack Overflow用户

发布于 2015-02-16 15:12:16

您可以:

  1. 将命令存储在命令队列\持久日志中
  2. 在NEventStore上使用命令id (guid)作为提交Id
  3. 将命令标记为在命令处理程序/管道挂钩/轮询客户端执行的命令

NEventStore为您提供相同AggregateId (streamid) + CommitId上的幂等性,因此如果应用程序在命令被标记为已处理并重放命令之前崩溃,则生成的提交将被NES自动丢弃。

票数 4
EN

Stack Overflow用户

发布于 2015-02-11 16:25:09

Afaik NEventStore是用于事件源的存储,即将域对象存储为事件流。命令和萨迦与此无关。这是您的服务巴士,应该负责耐久性和传奇管理。

就我个人而言,我只是把事件存储当作存储库的细节。应用程序服务(命令处理程序)将在生成的事件被持久化后分派它们。

如果应用程序崩溃,并且服务总线是持久的(而不是内存总线),那么事件/命令将再次自动处理,因为服务总线应该检测消息是否未被成功处理。当然,由于这个原因,您的消息处理程序应该是幂等的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28407510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档