CQRS - 最终一致性

use*_*870 6 eventual-consistency cqrs

我有以下场景需要按照CQRS模式实现:

  1. 用户登录
  2. 用户输入一些保险详细信息
  3. 用户要求决定是否适用
  4. 用户查看决定的结果

这似乎相当简单,但我的问题是在步骤3和4之间,在步骤3我发送一个ApplyForDecision命令,它将从承保服务得到一个决定,然后一个带有该决定结果的事件被发送到BUS用于读取存储稍后使用它并使用决策结果更新视图表.

问题出在UI上,我如何让用户知道决定正在应用,因为在CQRS中,读取模型没有"直接"更新,我如何让UI显示决策正在进行中并且很快就会'到了吗?

我还需要让用户能够注销并重新登录,因为该决定可能尚未应用,如何让UI显示"待决决策屏幕"?

Phi*_*ett 7

答案是立即引发一个事件,指示已经应用了决定,更新读取数据库并直接重定向到您的待决决策屏幕,无论读取数据库是否已经被更新.静态文本'将要与您联系的决定'或类似的内容.他们可以刷新或稍后回来,更有可能获得真实的数据.然后,当决​​定已经确定时,您有一个DecisionMade事件并更新读取数据库,相应地发送电子邮件,无论情况如何.

这是您在CQRS中必须处理的最终一致性的权衡.通常,当我对表单上的域对象属性进行更改时,我会在后端执行其杂务时在用户获得的即时反馈中伪造它.是的,有点难看,但用户不知道.

  • 很好的答案,特别是关于用户不知道的.这是关键,确保用户不会注意到.例如,您可以在项目更新的浏览器或服务器缓存中存储.当您访问数据和缓存中的readmodel时,您会注意到数据尚未更新,您自己这样做,但仅限于此用户.SignalR也非常适合尽快更新其他客户端. (2认同)

Tom*_*Tom 3

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