【发布时间】:2015-02-16 23:12:16
【问题描述】:
NEventStore:5.1
简单设置:WebApp (Asp.NET 4.5) == 命令端
我正在寻找不丢失命令的“正确”方法,着眼于 sagas/process-managers,这可能会无休止地等待一个实际上从未发生过的命令产生的事件处理。
旧:调度员
我最初使用了同步命令,但关注 sagas/process-managers 我认为先存储它们然后通过 SyncDispatcher(或 AsyncDispatcher)获取它们会更安全。否则,我担心的是,如果 saga 尝试发送命令并且由于 app-crash/powerloss/... 导致命令未完成,它将丢失并且 noone会知道。
所以我创建了一个 command-stream 并将每个命令附加到其中。 IsDispatched 显示,如果该命令已被处理。
那行得通。
PollingClient 和 Command-Stream
现在调度程序已经过时,我切换到 PollingClient。我丢失的是Dispatched 信息。
出现了启动问题:
我天真地从当前最新的检查点开始轮询以后,但是当应用程序重新启动时,可能会存储命令但之前没有执行崩溃并因此丢失(实际上发生了)。
我刚刚遇到了想法:
将命令的基本结果作为(非域)事件存储在另一个流中。
此流将包含 CommandSucceeded 和 CommandFailed 事件。
每当应用程序启动时,最新的 command-id 或 command-checkpoint-number 就会被提取出来,用于在该命令之后立即加载命令...
问题
- 我担心同步命令处理会导致丢失 saga 生成的命令的危险吗?如果是,为什么?
- 这通常是个好主意吗:一个大的命令流?
- 这通常是个好主意吗:将通用命令结果事件存储在流中?
【问题讨论】:
标签: command cqrs saga neventstore