DDD CQRS并发问题

时间:2011-11-18 10:51:48

标签: api concurrency domain-driven-design cqrs

我们已经建立了基于DDD和CQRS的架构。此外,我们还有一个带有OAUTH实现的RESTful API,供我们的客户端连接。 我们的客户连接到我们的API并代表其客户执行操作。他们的客户由我们的个人资料代表。

对于以下问题,我们没有很好的解决方案。客户端可以通过调用API上的方法来创建配置文件。问题是我们需要保证配置文件的唯一性。因此,我们目前所做的是检查读取模型中的现有配置文件,如果命令不存在则创建命令并将配置文件ID返回给客户端,以便它们可以执行其他API调用。

当客户端快速连续执行多个调用时,由于过时的读取模型,配置文件会创建两次而不是一次。我们不希望这样,但我们如何解决这个问题?

我们考虑过创建一个传奇以防止在域中创建多个配置文件,但这仍然有问题,因为如果他们的请求相同,我们需要将相同的配置文件ID返回给客户端。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

命令不应该返回结果。

您可以做的是创建一个包含新配置文件ID的命令(如果它是GUID)。如果您使用的是某种种子标识列,当然这不起作用。

但是说你的ID是GUID。然后,您可以将命令中的GUID传递给后端。只有当GUID尚不存在时,后端才会创建新的配置文件 - 并且您已经保证了单一性。

答案 1 :(得分:0)

根据我对CQRS模式的理解,命令层不应该使用读取模型来做出任何决定。命令层基于它自己的域进行处理。不是基于他阅读模型。始终对域数据进行验证。 你的profil创建命令处理程序应检查域中是否存在profil而不是读取模型。

答案 2 :(得分:-2)

这是对的。命令不应该依赖于ReadModel,因为ReadModel的最终一致原则。

只需在命令中使用Domain即可根据它做出决定。

通常CQRS + EventSourcing存储库的方法很少,但是它们是GetById(Guid id)。您可以使用它来检查域中是否已存在此类实体。