Задать вопрос

Event Sourcing транзакции проекций?

Всем привет. Подскажите, вот у меня есть слой Ui, откуда контроллер отправляет комманду в слой аппликации, который создает ивент, а потом проецирует его в нормализированную БД. Столкнулся с проблемой, когда случается коллизиция при создании одновременно двух одинаковых юзеров. Простыми словами, первый пользователь регистрируется, сохраняется ивент о регистрации и проецируется запись в нормализованную БД, а в это же время другой пользователь одновременно пытается зарегистрироваться под такими же данными и успевает проскочить сохранение ивента до того, как произойдет проецирование первого пользователя в нормализированную БД. В итоге получается, что у нас есть один нормально зарегистрированный пользователь и два ивента. Один из ивентов - правильный, и второй, который не валидный. Дело в том, что нельзя удалять ивенты, а можно только накатывать следующие. Если накатить еще один ивент для аггрегата о том, что пользователь уже создан, то это будет подразумевать, что этот ивент относится конкретно к контексту первого пользователя, а не к контесту второго. Как можно разрулить такую ситуацию?
  • Вопрос задан
  • 207 просмотров
Подписаться 4 Простой Комментировать
Решения вопроса 1
@RSalo Автор вопроса
Всё, решил проблему. Нужно сделать для транзакционных ивентов отдельный стрим. Все ивенты, которые могут подвергаться коллизии изначально сохранять туда, если эксепшина никакого нет при сохранении в нормализованную БД, то как-то делать линк этого события в основной стрим. Если же эксепшин есть, то эти ивенты так и будут оставаться в стриме для транзакции, никуда не будут вылазить и без разницы, какое количество невалидных ивентов создалось.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
angrySCV
@angrySCV
machine learning, programming, startuping
ивенты - это "факты", в отличии от команд, они говорят о том что уже случились (об истории).
вам нужно сначала создавать пользователя, потом записывать ивент о том что пользователь с таким-то айди создан.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы