В последнее время я читал об источниках событий и мне действительно нравятся идеи, стоящие за ним, но я застрял со следующей проблемой.
Допустим, у вас есть N одновременных процессов, которые получают команды (например, веб-серверы), генерируют в результате события и сохраняют их в централизованном хранилище. Давайте также предположим, что все переходные состояния приложения поддерживаются в памяти отдельных процессов путем последовательного применения событий из хранилища.
Теперь предположим, что у нас есть следующее бизнес-правило: каждый отдельный пользователь должен иметь уникальное имя пользователя.
Если два процесса получают команду регистрации пользователя для одного и того же имени пользователя X, они оба проверяют, что X отсутствует в их списке имен пользователей, правило проверяется для обоих процессов, и они оба сохраняют событие «новый пользователь с именем пользователя X» в хранилище ,
Теперь мы вошли в противоречивое глобальное состояние, потому что нарушено бизнес-правило (есть два разных пользователя с одним и тем же именем пользователя).
В традиционной системе стилей СУБД N - сервера <-> 1 база данных используется в качестве центральной точки синхронизации, которая помогает предотвратить такие несоответствия.
Мой вопрос: как источники событий обычно подходят к этой проблеме? Они просто последовательно обрабатывают все команды (например, ограничивают количество процессов, которые могут записать в хранилище, до 1)?