为了支持离线客户端,我想评估如何将多版本并发控制与CQRS-DDD系统相结合。
从CouchDB学习,我觉得很想为每个实体提供一个版本字段。然而,还有其他版本的并发算法,如矢量时钟。这让我想,也许我不应该为每个实体和/或事件公开这个版本的概念。
不幸的是,我看到的大多数实现都基于这样一种假设,即软件运行在一个服务器上,其中事件的时间戳来自一个可靠的来源。但是,如果某些事件是远程和脱机生成的,则本地客户端时钟偏移量会出现问题。在这种情况下,正常的时间戳似乎不是排序我的事件的可靠来源。
发布于 2014-09-29 09:29:23
我管理一个版本号,它对我来说效果很好。版本号的好处是,在处理并发冲突时,可以使代码非常显式。我的方法是确保我的DTO都有它们关联的聚合的版本号。当我发送命令时,它具有客户端上看到的当前版本。这个数字可能与聚合的实际版本同步,也可能不同步,即。客户已经离线了。在事件持久化之前,我检查版本号是否是我所期望的,如果没有,我会对照前面的事件检查其中的任何一个实际冲突。只有这样,我才会提出例外。这本质上是一种非常细粒度的乐观并发形式。如果您有兴趣的话,我已经在我的博客:http://danielwhittaker.me/2014/09/29/handling-concurrency-issues-cqrs-event-sourced-system/上写了更多的细节,包括一些代码示例
我希望这能帮上忙。
发布于 2014-01-31 21:08:21
我建议你看看格雷格在这个问题上的陈述。它可能有你在寻找https://skillsmatter.com/skillscasts/1980-cqrs-not-just-for-server-systems的答案
发布于 2014-02-03 14:26:19
我想您应该重新考虑您的域,将远程客户端逻辑分离到它自己的有界上下文中,并使用已知的用于BC互操作的DDD原则将其与另一个BC集成。
https://stackoverflow.com/questions/21486891
复制相似问题