基线信息: 我正在使用外部 OAuth 提供程序进行登录。如果用户登录到外部 OAuth,他们可以进入我的系统。但是,此用户可能尚不存在于我的系统中。这不是真正的技术问题,但我使用 JOliver EventStore 是为了它的价值。
逻辑:
- 我没有为新用户提供指南。我只有一个电子邮件地址。
- 我在发送命令之前检查我的读取模型,如果用户电子邮件存在,我会发出带有 ID 的登录命令,如果不存在,我会发出带有生成 ID 的 CreateUser 命令。我的问题是新用户的情况。
- 使用新 ID 在事件存储中进行保存。
问题: 假设由于浏览器刷新或在实现与读取模型的一致性之前发生的一些其他异常,在读取模型更新之前以某种方式发出了两个创建命令。没关系,这不是我的问题。
发生了什么: 因为新 ID 是一个 Guid 梳,所以事件存储不可能知道这两个 CreateUser 命令代表同一个用户。当他们到达读取模型时,读取模型将知道(因为他们有相同的电子邮件)并且可以合并两条记录或采取其他一些补偿措施。但是现在我的读取模型与事件存储不同步,事件存储仍然认为这是两个独立的实体。
也许没关系,因为:
- 重放事件将对读取模型产生相同的影响,因此应该没问题。
- 因为这两个命令都是重复的“创建”命令,所以它们应该包含相同的信息,所以我不会在事件存储中丢失任何东西。
谁能说明他们如何处理类似问题?如果需要进行一些补偿操作,读取模型服务是否会在意识到它有重复条目时发出某种补偿命令?有没有我不考虑的更简单的方法?