如果我实现 CQRS 和事件溯源,假设数据的最终存储(读取存储)在 RDBMS 中,我如何维护数据的完整性和一致性?
如果事件已发布但 RDBMS 由于检查违规或缺少 FK 引用而拒绝从中派生的数据怎么办?
最佳答案
CQRS 意味着至少有 2 种模型:写入和读取。两者都可以存储在同一个数据库或不同的数据库中。使用 ES ,您使用的是事件存储,它本身可以在 rdbms 之上实现(在 .net 中有 NEventStore,afaik 可以与 许多 数据库 rdbms 或不一起使用)。
你说你在 rdbms 中有 read 模型,这很好。无需强制执行任何操作,因为它是读取 模型,模型更新程序之外的任何人都不会触及它。应用程序客户端只能查询该模型,而不能修改它。这就是为什么您首先有 2 个模型,以便域可以使用“写入”模型,而应用程序的其余部分可以使用“读取”模型。
另外,RDBMS 不应该真的拒绝任何东西。一个事件处理程序应该是幂等的,所以如果,比方说,处理程序插入一个 id 应该是唯一的东西,第二次调用应该简单地忽略任何唯一约束冲突。使用 CQRS,您使用 RDBMS 约束来支持幂等性,而不是实现某些业务规则。
此外,将读取模型视为“一次性模型”,可以随时更改或重建。
关于CQRS/事件溯源 : How to enforce data-integrity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23455978/