EventSourcing отлично работает, когда у нас есть уникальный уникальный EntityID, но когда я пытаюсь получить информацию от eventStore, отличного от определенного EntityId, у меня тяжелое время.CQRS Event Sourcing проверить имя пользователя уникально или нет из EventStore при отправке команды
Я использую CQRS с EventSourcing. В рамках поиска событий мы сохраняем события в таблице SQL в виде столбцов (EntityID (uniqueKey), EventType, EventObject (например, UserAdded)).
Таким образом, сохраняя EventObject, мы просто сериализуем объект DotNet и сохраняем его в SQL. Таким образом, все данные, связанные с событием UserAdded, будут в формате xml. Меня беспокоит, что я хочу убедиться, что имя пользователя, которое присутствует в db, должно быть уникальным.
Итак, при выполнении команды AddUser мне нужно запросить EventStore (sql db), существует ли конкретное имя пользователя уже в eventStore. Так что для этого мне нужно сериализовать все события UserAdded/UserEdited в хранилище событий и проверить, присутствует ли запрашиваемое имя пользователя в eventStore.
Но как часть команд CQRS не разрешается запрашивать, может быть из-за состояния гонки.
Итак, я попытался перед отправкой команды AddUser просто запросить eventStore и получить все USERNAMES от сериализации все события (UserAdded) и получать имена пользователей и, если требуется имя пользователя является уникальным, то снимать команду еще бросать исключение, имя_пользователя уже существует ,
Как и в случае с вышеуказанным подходом, нам нужно запросить весь db, и у нас могут быть сотни тысяч событий/дней. Поэтому выполнение запроса/десериализации займет много времени, что приведет к проблемам с производительностью.
Ищу для любого лучшего подхода/предложения для поддержания пользователя Unique либо получить все имена пользователей из eventStore или любого другого подход
Как сказал в своем ответе @Matt, используйте указатель рода на стороне команды/записи. Вы можете использовать что-то общее (не смотрели на NEventStore, поэтому я не знаю, есть ли у него что-то подобное): у меня есть интерфейс 'IKeyStore' в эксперименте: https://github.com/Shuttle/shuttle-recall- core/blob/master/Shuttle.Recall.Core/IKeyStore.cs, и вы можете увидеть и реализовать здесь: https://github.com/Shuttle/shuttle-recall-sqlserver/blob/master/Shuttle.Recall.SqlServer/KeyStore .cs --- Хэш произвольного ключа связан с AR id. Надеюсь, что это поможет :) –