如何使用CQRS在我的读数据库中伪装重复值

时间:2011-06-29 12:57:28

标签: cqrs

假设我的ReadDatabase中有一个User表(使用SQL Server)。在一个正规读/写数据库中,我可以像表上的索引一样放置,以确保不会将2个用户添加到具有相同电子邮件的表中。

因此,如果我尝试为不同用户添加一个已存在于我的表中的电子邮件地址的用户,则sql server将抛出异常。

在Cqrs中,我不能这样做,因为如果我将写入与域模型的readdatabas分离,通过将它放在asyncronus队列上,我不会把异常抛回给我,我将返回“OK”到用户界面和用户会认为他被添加到数据库中,而实际上他永远不会被添加到读取数据库中。

我可以在读取数据库中进行搜索,检查我的数据库中是否已有使用emailadress的用户,如果有,则通过异常返回UI。但是如果他们同时按下保存按钮,我会对数据库进行2次检查,看到数据库中没有任何用户的电子邮件,我发回去说没关系。把它放在我的队列上,然后它会失败(通过点击唯一标识符)。

我想从我的EventSource(它是一个SQL Server)加载所有用户,然后检查该集合,看看我是否有一个已经有这个电子邮件地址的用户。这听起来有点疯狂......

你们有多少人解决了这个问题?

我可以看到的方法是不使用异步队列,但使用同步队列,但这会影响性能,特别是当您有许多“读取存储”要写入时...

在这需要一些帮助...

1 个答案:

答案 0 :(得分:2)

搜索基于CQRS集的验证将为您提供此问题的解决方案。

Greg Young发表了关于拥抱最终一致性的业务影响http://codebetter.com/gregyoung/2010/08/12/eventual-consistency-and-set-validation/

JérémieChassaing发布了关于在域中发现缺少聚合根的帖子http://thinkbeforecoding.com/post/2009/10/28/Uniqueness-validation-in-CQRS-Architecture

相关的堆栈溢出问题:

How to handle set based consistency validation in CQRS? CQRS Validation & uniqueness