0

我有一个 CQRS 应用程序,在事件存储和读取模型之间具有最终一致性。在其中我有一个项目列表,在列表下有一个“新建”按钮。当用户成功创建新项目时,他将被引导回列表,但由于读取模型尚未更新(最终一致性),因此列表中缺少该项目。

我想伪造列表中的条目,直到更新读取模型。当新项目出现在实际列表中时,我如何最好地做到这一点以及如何将其删除?我预计读取模型会延迟大约 60 秒。

我确实意识到有更简单的方法可以在没有 CQRS 的情况下实现此行为,但应用程序的其余部分确实从 CQRS 中受益。

如果重要,应用程序是 ac# mvc4 应用程序。我一直在考虑涉及 HTML5 Web Storage 的解决方案,但想知道解决此类问题的最佳实践是什么。

4

3 回答 3

1

没关系,这是一个 asp.net mvc 应用程序。除了告诉用户稍等外,我看到的唯一解决方案是使用另一个生成相同模型的同步事件处理程序(当然,实际的模型生成应该封装在服务中)并将其发送到内存缓存。

内存中的所有内容都使其非常快,并且同步意味着它会在请求结束之前自动执行。我假设命令也同步执行。

然后在您的查询存储库中,您还考虑来自缓存的结果,如果该结果已由数据库返回,则将其删除。

就个人而言,对于我知道我希望用户可以使用并且读取模型生成很简单的事情,我只会使用同步事件处理程序。用户在提交内容时不介意等待几秒钟,如果更新读取模型需要几秒钟,您就知道您遇到了后端问题。

于 2013-10-23T07:31:08.537 回答
1

在这种情况下,您可以完全自信地在 UI 中呈现结果。直接呈现这些信息和从读取模型中读取它没有区别。

您的域对象与 UI 是最新的,这才是真正重要的。此外,如果您在每个操作中正确验证您的 AR 状态并跟踪与 AR 版本的并发性,那么您是安全的,您的模型将受到保护,免受无效操作的影响。

最后,你的 UI 不同步的概率是多少?如果您有许多用户同时修改您正在显示的信息,则可能会发生这种情况。这可以通过创建基于任务的 UI 并遵循规则“每个请求在 AR 中执行一个命令/操作”来避免。

在非规范化器完成工作之前,读取模型可以不同步。

另一方面,如果命令将在 saga 和 AR 之间生成对话(长时间运行的操作),那么您不能这样做,并且必须警告用户。

于 2013-11-04T23:22:22.907 回答
0

我看到只有当应用程序环境有多个前端服务器托管应用程序并且所有这些服务器都有自己的读取模型副本时,最终一致性才适用于应用程序。所有服务器都使用相同的事件存储副本。

当某些内容更改为事件存储时,用于向用户读取结果的读取模型必须与事件存储同步更新。其余服务器和由它们管理的读取模型可以使用最终一致性进行更新。

这种方式结果给用户(项目列表)可以从本地读取模型副本中读取,因为它已经同步更新。无需特殊复杂的虚假更新/回滚。

用户可以看到不完整列表的唯一情况是用户在更新更改后按 F5 刷新列表,负载均衡将用户请求定向到读取模型尚未更新的前端服务器(60 秒延迟),但这可以避免,以便负载平衡不会在会话中间更改用户服务器。

因此,如果应用程序只有一个前端服务器,则最终一致性不是很有用,或者如果没有一些特殊的虚假更新/回滚读取模型,它不会带来任何好处......

于 2013-10-18T18:28:36.403 回答