CQRS - 最终一致性

7
我有以下场景需要按照CQRS模式实现:
1. 用户登录 2. 用户输入一些保险细节 3. 用户请求进行决策 4. 用户查看决策结果
这似乎很简单,但我的问题出现在第三步和第四步之间。在第三步,我发送一个"ApplyForDecision"命令,从承保服务中获取决策,然后将具有决策结果的事件发送到总线以供读取存储稍后使用并使用决策结果更新视图表。
问题在于UI上,如何让用户知道正在应用决策,因为在CQRS中,读取模型不会立即更新,如何使UI显示决策正在进行中并且即将到达?
我还需要让用户能够退出并重新登录,因为决策可能尚未应用,如何使UI显示“待定决策屏幕”?

UI是Web客户端还是智能客户端? - stung
1
状态是否发生了任何变化?我的意思是,这个决策应用程序是否需要确认某种形式的计算?如果是的话,这是否对系统中的“其他人”可见?这种情况如何高度协作? - Yves Reynhout
2个回答

7
立即引发一个事件,表示决策已经被申请执行,更新读取数据库,并立即重定向到待决策的屏幕,无论此时读取数据库是否已被更新。使用静态文本“待决策,您将会接到通知”或类似语句。用户可以刷新或稍后再回来,很可能会得到真实数据。然后,在决策已经做出时,你有一个DecisionMade事件,更新读取数据库,按情况发送电子邮件等。
这就是在CQRS中必须处理的最终一致性的权衡。通常,当我在表单上更改域对象属性时,我在后端完成其任务的同时,通过立即反馈来欺骗用户。是的,有点丑陋,但用户不知道。

2
好的答案,尤其是关于用户不知道的部分。这是关键,确保用户没有察觉到。例如,您可以将该项更新存储在浏览器或服务器缓存中。当您访问数据的读取模型并且在缓存中注意到数据尚未更新时,只对此用户进行更新。SignalR也非常适用于尽可能快速地更新其他客户端。 - Dennis van der Stelt

3

我认为解决方案是让您的命令发出“ApplyForDecisionRequested”和“ApplyForDecisionHandled”事件,并相应地更新您的读模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接