【问题标题】:How do I give users imidiate feedback in a CQRS web application如何在 CQRS Web 应用程序中为用户提供即时反馈
【发布时间】:2013-10-18 06:41:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript cqrs web-storage eventual-consistency


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答@Alex。这几乎是我和我的团队得出的结论。 AR 缩写是否代表 Aggregate?
    • 是的,聚合根(包括它的实体)...顺便问一下,你使用哪个框架(如果你使用的话)“做”CQRS?
    • 除了我们在这里所说的之外,...这里的要点是,与您获得的收益相比,您在 UI 中承担的风险很低,并且在某些情况下是允许的与 CQRS。另请注意,在某些情况下,这种思维方式不会让您摆脱改进 UI 以提高响应能力的责任。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 我不同意这一点。最终一致性与服务器数量或应用程序是否分布式无关。一旦您有 2 个未同步但将来会同步的相关模型,您将获得最终的一致性。 CQRS 为任何应用程序(大型、小型、本地或分布式)提供了极大的灵活性,但权衡是必须处理消息驱动的架构怪癖:服务总线、幂等性和最终一致性。
      • 是的,你是对的。我的观点更多的是,当需要读取数据时,应该以某种方式同步更新数据。我不推荐虚假更新,因为它们会给系统增加不必要的奇怪复杂性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多