如何在 CQRS Web 应用程序中为用户提供即时反馈

How do I give users imidiate feedback in a CQRS web application

本文关键字:用户 CQRS Web 应用程序      更新时间:2023-09-26

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

我想伪造列表中的条目,直到读取模型更新为止。如何最好地执行此操作,当实际列表中存在新项目时,如何删除它?我预计读取模型需要大约 60 秒的延迟才能赶上。

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

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

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

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

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

读取模型可以取消同步,直到非规范化程序完成其工作。

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

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

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

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

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

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

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

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

用户

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

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