CQRS - 最终一致性

时间:2010-08-05 11:39:07

标签: cqrs eventual-consistency

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

  1. 用户登录
  2. 用户输入一些保险详情
  3. 用户要求做出决定
  4. 用户查看决定的结果
  5. 这似乎相当简单,但我的问题是在第3步和第4步之间,在第3步,我发送了一个ApplyForDecision命令,该命令将从承保服务获得一个决定,然后该决定的结果是发送到BUS以供读取存储稍后使用它并使用决策结果更新视图表。

    问题在于UI,我如何让用户知道正在应用决策,因为在CQRS中,读取模型不会“直接”更新,如何让UI显示决策正在进行中,会“很快”到达吗?

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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