使用 EventSourcing 和 CQRS 时,您的读取模型通常具有最终一致性。假设我们有一个
Customer
实体,它是事件源的,并且该实体具有社会安全号码属性。这个号码必须是唯一的,所以在创建一个新的Customer
时,我们必须检查这个号码是否还没有被使用过。
进行这种验证的常用方法是什么?我可以看到三个选项:
加载所有
Customer
实体的全部事件,对所有实体进行再水化,然后验证没有人再次使用该号码。
查询读取模型,但我读到的关于 ES+CQRS 的所有内容都明确表示我们不应该这样做,因为最终一致性。
只为这些数字创建一个单独的表(最好在事件的同一个数据库中,这样我们就可以将事件和数字保存在同一个事务中,假设它是一个关系数据库)。
如果我们使用关系数据库,选项 3 似乎是最好的选择,因为如果所有事情都发生在同一个事务中,我们就不会受到最终一致性的影响。
对于“获取所有年龄在 30 岁以上的客户”这样的查询,我可以看到同样的情况。除了重建整个流以查询它们或查询读取模型之外,我看不到其他选项。
对此有什么想法吗?