2013-12-21 3 views
2

Я смотрел и читал несколько руководств о CQRS, но ВСЕ из них не используют пример реального мира, все из них (To делает вещи легкие) имели только хранилище событий памяти. И в этом примере легко и быстро получить текущее состояние объекта от «переигровки» событий.CQRS, все еще не получает его полностью, что сохранено в БД; (

Но как это работает в реальном слове пример с базой данных SQL. Скажем, у меня есть система с пользователями.

и у меня есть пользовательский интерфейс, где я могу добавлять и редактировать пользователей, но также получить список всех пользователей.

Теперь, основываясь на том, что говорят уроки, у меня есть мои события, сохраненные в db, скажем, каждый пользователь имеет 3 изменения в своем профиле, и у нас 100 000 пользователей.

Теперь у меня есть репо с GetById. В обычной системе без CQRS я получаю ровно одну запись на основе Id. Быстрое и малое использование ресурсов.

Но теперь в системе CQRS мне нужно загрузить 3 записи из БД и применить их к новому пользовательскому объекту и вернуть это ... это не то, что исполнитель, но я бы сказал: Возможно, жизнь с ним, из-за вырубки леса и так далее ».

Но как я могу использовать сценарий списка, где я показываю 50 пользователей на одной странице. 50 раз x 3 записи, и это для каждой страницы нажмите ??? И это не только для клиентов, может быть, счетов-фактур, заказов и т. Д., Какими ресурсами это?

Получаю ли я что-то совершенно неправильное в отношении CQRS/EventSourcing или у меня есть жизнь с этим сумке?

Сердечные приветы

ответ

6

Denormalized read model/persisted view model - это то, что вам не хватает. Основное преимущество CQRS заключается в том, чтобы обрабатывать чтения и записи по-разному и оптимизировать их по-разному. Вы загружали бы агрегаты с событиями для записи. Для чтения ваша система просто прочитает таблицу, созданную для этой цели. Эта таблица может быть SQL или NoSQL и, вероятно, не включает в себя присоединяется и т.д.

См Microsoft шаблонов и практика CQRS путешествие, например http://msdn.microsoft.com/en-us/library/jj554200.aspx

+0

Я знаю, что CQRS - это разделение на чтение и запись, и в этом большая часть. Но все после этого неясно для меня. Крошечный пример в реальном мире был бы замечательным. UpdateUserCommand в UserAggregat запускает событие UserUpdatedEvent, которое будет храниться в сериализованной таблице событий SQL. Я тоже получил эту часть. Это сторона записи. Но как обрабатывать сторону чтения, есть ли таблица пользователя или нет (только таблица событий), если она есть, делает ли она команду не только вставлять в таблицу событий, но также обновляет пользователя в таблице пользователя ? И чтение работает только с пользовательской таблицей? – SharpNoiZy

+0

Посмотрите на образец от MS, он охватывает все это. Там может быть одна или несколько пользовательских таблиц, которые предназначены для отображения необходимой информации. Событие может обрабатываться одним или несколькими процессорами, которые обновляют другие представления. Эти представления, как правило, очень просты, и данные можно отбросить и просмотреть перестроенные путем запуска событий через процессор снова – GraemeMiller

2

Я думаю (и я новичок в CQRS я должен указать) ключ думать об этом, чтобы разделить понятия чтения данных и записи данных. В вашем случае вам нужно создать хранилище данных, которое можно было бы прочитать для ваших страниц листинга. Этот магазин будет доступен только для чтения и обновляется, когда запись происходит в хранилище событий или даже воссоздается путем повторного воспроизведения всех событий (например, если он был поврежден).

1

Yeap, вы ошибаетесь. Вы не можете использовать запись для запроса. Вы должны создать денормализованное хранилище, используя прослушиватели, которые реагируют на события домена (может быть асинхронно). Затем используйте это хранилище для быстрых запросов.