0

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

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

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

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

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

你们是怎么解决的?

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

在这里需要一些帮助...

4

1 回答 1

2

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

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

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

相关堆栈溢出问题:

如何在 CQRS 中处理基于集合的一致性验证? CQRS 验证和唯一性

于 2011-06-29T13:53:15.093 回答