事件溯源和写入验证

Event sourcing and validation on writes

在 ES 和 CQRS 方面还很年轻,我知道它们与数据的最终一致性密切相关。

当我们应该在写入存储之前执行验证时,最终一致性可能会出现问题,例如检查电子邮件地址是否已被现有用户使用。以强一致的方式做到这一点的唯一方法是停止接受新事件,完成对我们视图的剩余事件的处理,然后查询视图。我们显然不想走那么远,Greg Young 实际上 recommends 拥抱最终一致性并处理(罕见的)我们打破约束的情况。

将这种方法推向极限,我的理解是,这意味着,例如,在开发 Web API 时,响应 'OK' 每个请求,因为当时这是不可能的的请求,验证它...我是在正确的轨道上,还是遗漏了什么?

正如我在上面的评论中所暗示的,

这为客户端提供了一种在必要时轮询状态更新的方法。

如果需要,客户端可以监视状态,但或者,它也可以简单地触发并忘记,假设如果它得到any 某种 200 范围的响应,该命令将 最终 被应用。如果您有一个可以传播错误的替代通道,这可能是一个很好的选择。例如,如果您知道哪个用户提交了命令,并且您有该用户的电子邮件地址,则可以在应用命令失败时发送电子邮件。

CQRS 架构的要点之一是系统的边缘在接受命令之前应尽其所能验证命令的正确性。基于系统的已知状态(由查询端公开),系统可以努力验证给定的命令是否可接受。如果它这样做,那么如果您接受命令,唯一应该发生的永久性错误就是并发冲突。根据您的系统接近一致状态的速度,这种并发冲突可能很少,例如向用户发送电子邮件是一种适当的错误处理策略。