如何在 CQRS Web 应用程序中为用户提供即时反馈
How do I give users imidiate feedback in a CQRS web application
我有一个 CQRS 应用程序,该应用程序在事件存储和读取模型之间具有最终一致性。在其中,我有一个项目列表,列表下有一个"新建"按钮。当用户成功创建新项时,他将被定向回列表,但由于读取模型尚未更新(最终一致性),列表中缺少该项。
我想伪造列表中的条目,直到读取模型更新为止。如何最好地执行此操作,当实际列表中存在新项目时,如何删除它?我预计读取模型需要大约 60 秒的延迟才能赶上。
我确实意识到有更简单的方法可以在没有 CQRS 的情况下实现此行为,但应用程序的其余部分确实受益于 CQRS。
如果很重要,应用程序是 c# mvc4 应用程序。我一直在考虑涉及HTML5 Web存储的解决方案,但想知道解决此类问题的最佳实践是什么。
在这种情况下,您可以完全放心地在 UI 中显示结果。直接呈现此信息和从读取模型中读取此信息没有区别。
您的域对象是最新的 UI 的,这才是这里真正重要的。此外,如果您在每个操作中正确验证了AR状态,并且跟踪了AR版本的并发性,那么您是安全的,并且您的模型将受到保护,不会受到无效操作的影响。
最后,您的 UI 不同步的概率是多少?如果有许多用户同时修改您正在显示的信息,则可能会发生这种情况。这可以通过创建基于任务的 UI 并遵循"每个请求在 AR 中执行一个命令/操作"规则来避免。
读取模型可以取消同步,直到非规范化程序完成其工作。
另一方面,如果命令将在 saga 和 AR 之间生成对话(长时间运行的操作),那么您不能这样做,必须警告用户。
关系,这是一个 asp.net 的mvc应用程序。我看到的唯一解决方案,除了告诉用户稍等片刻之外,是另一个但这次同步事件处理程序生成相同的模型(当然实际的模型生成应该封装在服务中)并将其发送到内存缓存。
将所有内容都放在内存中使其非常快,同步意味着它在请求结束之前自动执行。我假设该命令也是同步执行的。
然后,在查询存储库中,您还会考虑缓存中的结果,如果数据库已返回该结果,则将其删除。
就个人而言,对于我知道我希望对用户可用并且读取模型生成微不足道的事情,我将只使用同步事件处理程序。用户不介意在提交内容时等待几秒钟,如果更新读取模型需要几秒钟,您就知道您遇到了后端问题。
我看到,仅当应用程序环境有多个前端服务器托管应用程序并且所有这些服务器都有自己的读取模型副本时,最终一致性才适用于应用程序。所有服务器都使用相同的事件存储副本。
当某些内容更改为事件存储时,用于向用户读取结果的读取模型必须与事件存储同步更新。其余服务器和由它们管理的读取模型可以使用最终一致性进行更新。
这样,用户(项目列表)的结果可以从本地读取模型副本中读取,因为它已经同步更新。无需特殊复杂的虚假更新/回滚。
用户可以看到不完整列表的唯一情况是用户在更新更改后按 F5 刷新列表,负载平衡将用户请求定向到读取模型尚未更新的前端服务器(60 秒延迟),但可以避免这种情况,以便负载平衡不会在会话中途更改用户服务器。
因此,如果应用程序只有一个前端服务器,则最终一致性不是很有用,或者如果没有一些特殊的错误更新/回滚与读取模型,它不会带来任何好处......
- 从远程脚本获取用户IP
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- d3基于用户选择动态更新节点
- 同步调用,直到用户通过angular验证为访问者
- 使用javascript搜索具有用户输入的数组
- 如何使用jquery确定用户是否年满18岁
- Meteor-添加用户自定义字段的方法不起作用
- React Native通过Navigator将用户输入数据传递到选项卡栏IOS中的组件
- 跟踪用户点击Adsense广告的IP地址
- 使用javascript反复检查用户在facebook上的登录状态
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- 如何检查用户在html5视频播放器中观看了完整的视频
- 一个密码测试程序,如果存在空格,它会提醒用户
- 如何使用JavaScript中的用户输入创建序列/序列
- 当用户按下回车键时,自动在text区域/text中插入消息
- 显示某个用户ID的某个标签的30张Instagram图片
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- javascript跨浏览器确定用户是否滚动到页面底部
- JSON获取用户id's在嵌套数组中
- 如何在 CQRS Web 应用程序中为用户提供即时反馈