CQRS /事件来源:如何实施数据完整性?

Coc*_*sin 2 cqrs event-sourcing

如果我实现CQRS和事件源,那么假设数据的最终存储(读取存储)在RDBMS中,那么如何保持数据的完整性和一致性?

如果发布事件但由于违反检查或缺少FK引用而RDBMS拒绝从该事件派生的数据怎么办?

Mik*_*eSW 5

CQRS至少包含两个模型:写入和读取。两者都可以存储在同一数据库中或不同的数据库中。使用ES时,您使用的是事件存储,它本身可以在rdbms之上实现(.net中有NEventStore,afaik是否可以与许多数据库rdbms 一起使用)。

您是说您在rdbms中具有读取模型,这很棒。不需要强制执行任何操作,因为它是读取的模型,模型更新程序之外的任何人都无法触及。应用程序客户端只能查询该模型,而不能对其进行修改。这就是为什么首先要有2个模型的原因,以便Domain可以使用“ write”模型,而应用程序的其余部分可以使用“ read”模型。

同样,RDBMS不应真正拒绝任何东西。事件处理程序应该是幂等的,因此,例如,如果该处理程序插入的ID应该是唯一的东西,则第二次调用应仅忽略任何唯一约束冲突。使用CQRS,您正在使用RDBMS约束来支持幂等,而不是实施某些业务规则。

同样,将读取的模型视为“丢弃模型”,可以随时更改或重建它。