Domain driven design 多版本并发控制与CQRS和DDD

Domain driven design 多版本并发控制与CQRS和DDD,domain-driven-design,distributed,cqrs,mvcc,Domain Driven Design,Distributed,Cqrs,Mvcc,为了支持脱机客户机,我想评估如何使用CQRS-DDD系统来适应多版本并发控制 从CouchDB学习时,我很想为每个实体提供一个版本字段。但是,还有其他版本的并发算法,如。这让我想到,也许,我不应该为每个实体和/或事件公开这个版本概念 不幸的是,我所看到的大多数实现都是基于软件在单个服务器上运行的假设,其中事件的时间戳来自一个可靠的源。但是,如果某些事件是远程和脱机生成的,则本地客户端时钟偏移存在问题。在这种情况下,正常的时间戳似乎不是排序事件的可靠来源 这是否迫使我评估某种形式的解决方案,而不是

为了支持脱机客户机,我想评估如何使用CQRS-DDD系统来适应多版本并发控制

从CouchDB学习时,我很想为每个实体提供一个版本字段。但是,还有其他版本的并发算法,如。这让我想到,也许,我不应该为每个实体和/或事件公开这个版本概念

不幸的是,我所看到的大多数实现都是基于软件在单个服务器上运行的假设,其中事件的时间戳来自一个可靠的源。但是,如果某些事件是远程和脱机生成的,则本地客户端时钟偏移存在问题。在这种情况下,正常的时间戳似乎不是排序事件的可靠来源

  • 这是否迫使我评估某种形式的解决方案,而不是基于时间戳

  • 离线CQRS客户端必须评估哪些实现细节,以便与中央服务器同步延迟的事件链

  • 有什么好的开源例子吗

  • 我的DDD实体和/或CQRS查询DTO是否应该提供版本参数


  • 我建议你看看格雷格关于这个问题的报告。它可能有您正在寻找的答案

    我想您应该重新思考您的域,在其自身的有限上下文中分离远程客户端逻辑,并使用已知的DDD for BC interop原则将其与其他BC集成。

    我管理一个版本号,它对我来说运行良好。版本号的好处在于,在处理并发冲突时,可以使代码非常明确。我的方法是确保我的DTO都具有与其关联的聚合的版本号。当我发送命令时,它具有客户端上显示的当前版本。此数字可能与聚合的实际版本同步,也可能不同步,即客户端已脱机。在事件被持久化之前,我检查版本号是否是我期望的版本号,如果不是,我会检查前面的事件,以查看它们是否存在冲突。只有这样,如果他们这样做了,我才会提出一个例外。这本质上是一种非常细粒度的乐观并发形式。如果您感兴趣,我已经在我的博客上写了更多详细信息,包括一些代码示例,网址:

    我希望这有帮助