CQRS/事件溯源 : How to enforce data-integrity?

标签 cqrs event-sourcing

如果我实现 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/

相关文章:

cqrs - 使用CQRS的阅读方实现方法

java - Axon - 在查询时进行投影的最简单方法

cqrs - 乐观锁定和聚合根的内部实体

domain-driven-design - EventSourcing 网关(与外部系统同步)

domain-driven-design - CQRS:如何实现投票机制(多对多关系)

domain-driven-design - DDD 和 CQRS : use multiple repositories from a single command handler?

c# - 没有参数的 CQRS 查询处理程序

domain-driven-design - 事件溯源系统是否需要事务发件箱?

php - 在 CQRS 中构造带有可选参数的命令对象

spring-boot - org.axonframework.eventsourcing.IncompatibleAggregateException(轴突框架 : Aggregate identifier must be non-null after applying an event)