Основна информация: Използвам външен доставчик на OAuth за влизане. Ако потребителят влезе във външния OAuth, той може да влезе в моята система. Този потребител обаче може все още да не съществува в моята система. Всъщност не е технологичен проблем, но използвам JOliver EventStore за това, което си струва.
Логика:
- Не ми е дадено ръководство за нови потребители. Просто имам имейл адрес.
- Проверявам моя модел за четене, преди да изпратя команда, ако имейлът на потребителя съществува, издавам команда за влизане с идентификатора, ако не, издавам команда CreateUser с генериран идентификатор. Проблемът ми е в случай на нов потребител.
- Възниква запис в хранилището на събития с новия идентификатор.
Проблем: Да предположим, че по някакъв начин са издадени две команди за създаване, преди моделът за четене да бъде актуализиран поради опресняване на браузъра или някаква друга аномалия, която възниква, преди да се постигне съгласуваност с модела за четене. Всичко е наред, това не е мой проблем.
Какво се случва: Тъй като новият идентификатор е гребен на Guid, няма шанс хранилището на събития да знае, че тези две команди CreateUser представляват един и същ потребител. Докато стигнат до модела за четене, моделът за четене ще знае (защото имат един и същ имейл) и може да обедини двата записа или да предприеме някакво друго компенсиращо действие. Но сега моят модел за четене не е синхронизиран с магазина за събития, който все още смята, че това са две отделни единици.
Може би няма значение, защото:
- Повторното възпроизвеждане на събитията ще има същия ефект върху прочетения модел, така че трябва да е ОК.
- Тъй като и двете команди са дублиращи се команди за създаване, те трябва да съдържат идентична информация, така че не е като да губя нещо в хранилището на събития.
Може ли някой да осветли как са се справили с подобни проблеми? Ако трябва да се извърши някакво компенсиращо действие, услугата за четене на модел издава ли някаква команда за компенсация, когато осъзнае, че има дублиран запис? Има ли по-проста методология, която не обмислям?