【发布时间】:2019-02-16 22:41:22
【问题描述】:
我们想在我们的新设计中实现 cqrs。我们对处理命令处理程序和读取模型有一些疑问。我们了解到,在处理命令时,我们应该对 aggregateId 采取乐观锁定。但是在处理 readModels 时应该考虑什么方法。我们是否应该锁定整个 readModel 或 aggregateId 或者在处理读取模型时从不锁定。
案例 1. 锁定整个 readmodel 时 -> 最安全,但速度不好。
案例 2 - 锁定 aggregateId。这里可能会出现两个问题。如果我们明智地使用 lock aggregateId -> 那么如果读取模型服务器重新启动会怎样。它不知道从哪里重新开始。
案例 3 - 永远不要锁定。在这种方法中,我认为数据可能处于损坏状态。例如,生成了一个订单插入事件,并且通过一些工作流/传奇,订单更新事件也发生了。如果订单更新事件先出现而订单插入事件尚未处理怎么办?
希望我能够解决我的问题。
【问题讨论】:
-
这有关系吗?使用 CQRS 时,您通常会在最终一致性的假设下工作。您通常将事件泵入队列,以保证您执行另一个工作人员的顺序,从队列中获取项目并更新读取存储。如果在一个请求中订单似乎尚未关闭更新或没有更新,它通常不是那么糟糕,因为读取存储只是提供信息。您的权威存储是写入存储(用于通过重播事件来填充您的聚合)
-
readStore 不仅仅是提供信息,我认为您所有的 UI 数据都来自 ReadModel 而不是来自聚合(写入模型)。假设我们有多个工作人员正在处理事件总线。一名工人已弹出下订单事件。正在处理并且意味着当另一个工作人员弹出 orderUpdated 事件时。现在如果第一个工人实际上还没有完成订单插入,就会出现问题。
-
我们正在通过总线或流序列化读取模型更新。如果您有一个从流中读取事件并应用于读取模型的工作进程 - 您不需要锁。
标签: domain-driven-design cqrs wolkenkit