我到处都看到有关确保CQRS架构唯一性的帖子,对于我来说,最明显的解决方案是在写方添加唯一索引,从未提及,而没有任何解释。
相反,我必须读取读取模型,并通过佐证补偿操作来解决并发问题。当您仅因违反唯一索引而拒绝命令时,似乎过于复杂,那为什么呢?
答案 0 :(得分:2)
为什么CQRS似乎在写方面阻止了唯一约束?
不是
它的作用是认识到在分布式集合上保持不变是一场噩梦。
对我来说,最明显的解决方案是在写侧添加唯一索引,而没有任何解释
是的。如果您没有分布式集合-如果集合中的所有元素都存储在一起-那么保持不变就很简单。
但是具有跨越两个数据库的唯一索引约束是什么意思?
为了用更现代的术语表达想法,指导性假设是业务逻辑应为scale agnostic。如果两个写模型真的彼此独立,那么我们应该能够将它们分开存储。
如果需要满足一个依赖于来自两个不同写入模型的数据的约束,那么这些写入模型并不是真正独立的。
Greg Young raised一个非常好的问题
发生故障会对业务产生什么影响?
毕竟,这是我们应该在域驱动设计中考虑的事情。
为什么事件源阻止我在唯一字段上建立索引?
真正的答案是:只要您的唯一约束和事件存储在一起,它就不会。
如果您的RDMBS带有一个代表集合元素的表以及存储事件的表,则可以在单个事务中一起更新两个表,如果违反了约束,则回滚整个混乱。
但是采用相同的想法,然后将事件集放置在与事件相比不同的数据库中?现在您有两个不同的事务需要协调。祝你好运。