基准信息: 我正在使用外部OAuth提供程序进行登录。如果用户登录到外部OAuth,则可以进入我的系统。但是,这个用户可能还不存在于我的系统中。这不是一个真正的技术问题,但我使用JOliver EventStore来评估它的价值。使用CQRS和EventStore创建并发
逻辑:
- 我没有给新用户的GUID。我只有一个电子邮件地址。
- 我发送一个命令前检查我的读取模型,如果用户电子邮件 存在,我发出带有ID的登录命令,如果没有,我发出带有生成ID的 CreateUser命令。我的问题是在新用户的情况下。
- 使用新ID在事件存储中发生保存。
问题: 假设有两种创建读取模型由于浏览器刷新或与实现读取模型的一致性之前发生其他异常更新之前命令莫名其妙发出。没关系,这不是我的问题。
会发生什么: 因为新的ID是一个GUID梳子,还有没有机会的情况下店将知道这两个CREATEUSER命令代表相同的用户。当他们到达阅读模型时,阅读模型将知道(因为他们有相同的电子邮件),并可以合并两个记录或采取其他补偿行动。但是现在我的阅读模型与事件存储不同步,它仍然认为这是两个独立的实体。
也许它并不关系,因为:
- 重播事件会对读取模型 同样的效果,这样应该没问题。
- 因为这两个命令都是重复的“创建”命令,它们应该包含相同的信息,所以它不像我在事件存储中丢失任何东西。
任何人都可以说明他们是如何处理类似的问题吗?如果某些补偿行为需要发生,读取模型服务会在发现重复条目时发出某种补偿命令?有没有更简单的方法我不考虑?
谢谢!
我的观点是,这是一个属于领域模型的决定,你应该追求这一行动。 –
只是要完成 - 这已多次讨论 - http://codebetter.com/gregyoung/2010/08/12/eventual-consistency-and-set-validation/ –
很好回答,感谢您对该主题的了解。我确信这已经被多次回答了,但是CQRS总的来说很难找到确切的答案,因为它们如此分散。我也同意我可能会过度复杂化并不重要的情况。在这种情况下,我可能不需要做任何事情,但在我需要解决此问题的情况下,案件本身提出了更多“方法问题”。感谢您的答案和链接。 – swannee