Исходная информация: я использую для входа внешнего поставщика OAuth. Если пользователь входит во внешний OAuth, он может войти в мою систему. Однако этот пользователь может еще не существовать в моей системе. На самом деле это не проблема технологии, но я использую JOliver EventStore, потому что это того стоит.
Логика:
- Мне не дают руководство для новых пользователей. У меня есть только адрес электронной почты.
- Я проверяю свою модель чтения перед отправкой команды, если электронная почта пользователя существует, я запускаю команду входа с идентификатором, если нет, я запускаю команду CreateUser с сгенерированным идентификатором. Моя проблема связана с новым пользователем.
- Сохранение происходит в хранилище событий с новым идентификатором.
Проблема. Предположим, что две команды создания каким-то образом были выполнены до обновления модели чтения из-за обновления браузера или какой-либо другой аномалии, которая возникает до достижения согласованности с моделью чтения. Это нормально, это не моя проблема.
Что происходит. Поскольку новый идентификатор представляет собой гребенку Guid, нет никаких шансов, что хранилище событий узнает, что эти две команды CreateUser представляют одного и того же пользователя. К тому времени, когда они доберутся до модели чтения, модель чтения узнает об этом (поскольку у них одинаковая электронная почта) и сможет объединить две записи или предпринять какие-либо другие компенсирующие действия. Но теперь моя модель чтения не синхронизирована с хранилищем событий, которое все еще считает, что это два отдельных объекта.
Возможно, это не имеет значения, потому что:
- Воспроизведение событий окажет такое же влияние на модель чтения, так что все должно быть в порядке.
- Поскольку обе команды дублируют команды Create, они должны содержать одинаковую информацию, поэтому я ничего не теряю в хранилище событий.
Может ли кто-нибудь объяснить, как они справились с подобными проблемами? Если необходимо выполнить какое-либо компенсирующее действие, выдает ли служба модели чтения какую-либо компенсационную команду, когда понимает, что у нее есть повторяющаяся запись? Есть ли более простая методология, которую я не рассматриваю?