为什么CQRS似乎阻止了写方面的唯一约束?

时间:2018-08-29 08:11:54

标签: indexing unique cqrs

我到处都看到有关确保CQRS架构唯一性的帖子,对于我来说,最明显的解决方案是在写方添加唯一索引,从未提及,而没有任何解释。

相反,我必须读取读取模型,并通过佐证补偿操作来解决并发问题。当您仅因违反唯一索引而拒绝命令时,似乎过于复杂,那为什么呢?

1 个答案:

答案 0 :(得分:2)

  

为什么CQRS似乎在写方面阻止了唯一约束?

不是

它的作用是认识到在分布式集合上保持不变是一场噩梦。

  

对我来说,最明显的解决方案是在写侧添加唯一索引,而没有任何解释

是的。如果您没有分布式集合-如果集合中的所有元素都存储在一起-那么保持不变就很简单。

但是具有跨越两个数据库的唯一索引约束是什么意思?

为了用更现代的术语表达想法,指导性假设是业务逻辑应为scale agnostic。如果两个写模型真的彼此独立,那么我们应该能够将它们分开存储。

如果需要满足一个依赖于来自两个不同写入模型的数据的约束,那么这些写入模型并不是真正独立的。

Greg Young raised一个非常好的问题

  

发生故障会对业务产生什么影响?

毕竟,这是我们应该在域驱动设计中考虑的事情。

  

为什么事件源阻止我在唯一字段上建立索引?

真正的答案是:只要您的唯一约束和事件存储在一起,它就不会。

如果您的RDMBS带有一个代表集合元素的表以及存储事件的表,则可以在单个事务中一起更新两个表,如果违反了约束,则回滚整个混乱。

但是采用相同的想法,然后将事件集放置在与事件相比不同的数据库中?现在您有两个不同的事务需要协调。祝你好运。