【发布时间】:2017-05-19 05:44:13
【问题描述】:
我正在尝试使用 Kafka 实现事件溯源系统,但遇到了以下问题。在新用户注册期间,我想检查用户提供的用户名是否已被使用。但是,请考虑两个用户尝试同时注册并提供相同用户名的情况。
根据我对 ES 工作原理的理解,处理注册请求的控制器将检查请求是否有效,然后将新事件(例如 NewUser)发送到 Kafka,最后选择该事件由另一个控制器将其保存在物化视图中(例如 Postgres DB)。问题是请求的验证是针对物化视图完成的,但它的实际持久性发生在以后。因此,由于 2 个请求是并行处理的(由不同的服务实例),它们可能都通过了验证,从而产生 2 个 NewUser 消息。但是,当第二个控制器尝试将这 2 个 NewUser 消息持久保存在数据库中时,保存第二个事件将失败,因为违反了用户名的唯一性约束。
关于如何解决这个问题的任何想法?
谢谢。
更新:
特别是,我想验证以下是否是解决问题的公认方法:
- 使用用户名作为 userId(限制性)
- 向按用户名和验证时分区的主题发送事件 完成发送事件到另一个主题
【问题讨论】:
标签: concurrency apache-kafka event-sourcing