Можно ли использовать CQRS для такого сайта, как StackOverflow? - PullRequest
8 голосов
/ 04 сентября 2010

Можете ли вы использовать архитектурный шаблон CQRS (Command-Query Responsibility Segregation) для создания сайта, такого как StackOverflow?Я относительно новичок в CQRS и DDD (Domain Driven Design), и я изучаю шаблон и пытаюсь смоделировать сайты, с которыми я знаком, по шаблону.Хотя я вижу, что CQRS полезен для многих аспектов сайта, такого как StackOverflow, есть несколько областей, в которых я не уверен (или, по крайней мере, не могу понять сразу).В частности:

  • Задавать вопросы Когда я создаю вопрос, я сразу вижу его и могу редактировать.В CQRS я запускаю команду типа «AskQuestion», и создается событие с именем «QuestionAsked».В конце концов, вопрос переносится в денормализованное хранилище данных.Но опыт SO мгновенен.Это возможно с CQRS?
  • Голосование Мои голоса отражаются немедленно.В CQRS я мог бы представить, что эти команды / события в конечном итоге перемещаются через шину событий в хранилище чтения.Но SO дает мне информацию немедленно.

Мои опасения связаны с концепцией немедленной обратной связи, которую предоставляет SO.Может ли CQRS это обеспечить?Если так, как это будет сделано?Есть ли хорошие примеры, иллюстрирующие, как с этим справиться?

Если это поможет, моя среда VS2010 / C # / SQL2008R2, но я открыт для других опций, таких как SQLite и т. Д. Я также ищув рамках NCQRS и LOKAD, а также образец Марка Найхофа, и я планирую загрузить образец Грега Янга.Больше я не нашел там образцов CQRS.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 06 сентября 2010

То, о чем вы на самом деле говорите, - это «конечная согласованность», о которой часто говорят в то же время, что и CQRS, но вы можете использовать любую технику независимо друг от друга.

Самое простое, что нужно сделать, это обновитьмодель, которую пользовательский интерфейс использует немедленно, и используйте ее, чтобы показать вопрос пользователю для дальнейших манипуляций.Различные операции, которые необходимо выполнить, чтобы другие пользователи могли видеть обновление, могут затем продолжаться без блокировки пользовательского интерфейса.Чтобы это работало, вам нужно проверить свою команду, чтобы она почти наверняка была успешной перед ее отправкой (если команда не выполняется во время выполнения, вам нужно будет обработать ситуацию, например, включить какой-то обратный вызов в модель пользовательского интерфейса).

Стоит также помнить, что «случайность» такого рода вещей обычно настолько быстра, что в любом случае все сразу появляется, даже для других пользователей.

5 голосов
/ 06 августа 2015

Давайте посмотрим на два вопроса ...

Задание вопросов Когда я создаю вопрос, я сразу вижу его и могу его редактировать.В CQRS я запускаю команду типа «AskQuestion», и создается событие с именем «QuestionAsked».В конце концов, вопрос переносится в денормализованное хранилище данных.Но опыт SO мгновенен.Возможно ли это с CQRS?

Этого легко достичь.Каждый ли пользователь должен видеть вопрос немедленно или только тот, кто его задает?Если это покажется всем за 1-2 секунды, это что-то изменит?Чаще всего в последовательно согласованных системах существует разница между пользователем, отправляющим запрос, и любым другим пользователем.

Голосование Мои голоса отражаются немедленно.В CQRS я мог бы представить, что эти команды / события в конечном итоге перемещаются через шину событий в хранилище чтения.Но SO дает мне информацию немедленно.

Предоставляет ли SO ее немедленно?Давайте попробуем другой пример, Facebook.Когда вы нажимаете «нравится» на что-то, это сразу же появляется в ваших лайках?Уловки пользовательского интерфейса, такие как установка больших пальцев, заставляют вас чувствовать, что это так.Другой пример, амазонка.Когда вы нажимаете добавить в корзину, она сразу попадает в вашу корзину?Визуальные представления, такие как «добавлено в корзину» или «палец вверх», заставляют пользователя чувствовать себя так, как будто это сделано.

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

В качестве примечания многие люди думают, что такого рода вещи сделаны для масштабируемости (что иногда имеет место).Чаще всего они делаются для надежности.Вопрос возникает, если XYZ не работает.Хотите ли вы странные рандомизированные локальные сбои или вы хотите рисковать широко распространенными сбоями?Один из лучших примеров, которые можно увидеть здесь, это проверить Amazon на предмет любезной покупки, странно, что они могут обработать вашу кредитную карту примерно за 100 мс, в то время как все остальные занимают 3-5 секунд :) Что произойдет, если их система обработки кредитных карт не работает

3 голосов
/ 05 сентября 2010

Когда вы задаете вопрос, вы можете «подделать» данные в пользовательском интерфейсе. Похоже, что он был немедленно обновлен для пользователя (вас), но пройдет некоторое время, прежде чем другие пользователи увидят ваш вопрос. Вы должны сделать то же самое для обработки голосования.

Если вам нужна немедленная обратная связь, вы можете рассмотреть другие решения. Но есть некоторые приемы, которые вы можете сделать, чтобы получить немедленную обратную связь в решении CQRS. Если вам, например, необходимо подтвердить, что имя пользователя является уникальным, вы можете запросить базу данных чтения, чтобы узнать, существует ли имя пользователя. Если это не так, вы можете использовать его. Но если тем временем другой пользователь выбрал то же имя, вы получите конфликт на командной стороне. Вам необходимо обработать это в модели вашего домена и, например, дать пользователю сгенерированное имя пользователя и отправить его ему по электронной почте. Позже он может изменить это на что-то другое.

1 голос
/ 22 января 2011

Поддельно или обманом вы можете думать о событии как о «ожидающем событии», то, что, вероятно, будет успешным на этапе фиксации / публикации, но может завершиться неудачей.Чем больше проверки вы выполняете на стороне клиента, до первоначальной отправки на фиксацию, тем больше вероятность того, что она пройдет успешно.Поэтому, если вы намереваетесь положиться на ожидающий коммит, спланируйте более толстого клиента с точки зрения проверки и предоставления бизнес-правил.

Затем можно позволить пользователю продолжать использовать данные (для дальнейшей модификации), пометивили пометить данные в пользовательском интерфейсе как полагающиеся на «ожидающий коммит».Это будет мета-атрибут объекта или атрибута.Конечно, добавление и использование этого мета-атрибута увеличит сложность, но в зависимости от приложения может возникнуть необходимость.

Очереди / истории команд на стороне клиента могут быть одним из способов помочь в ситуациях, когда последующие события зависели от окончательного ожидающего выполнения коммита.Другими словами, все, что полагается на ожидающий коммит, может быть частью истории, которую можно свернуть, сохранить, пока вносятся исправления в неудавшийся ожидающий коммит, развернуть и повторно применить к измененному и повторно переданному ожидающему событию, а также после уведомленияожидающее событие было успешным в коммите, вся последующая история на стороне клиента начала бы раскручиваться, отправляла следующий элемент в очередь, помечая его как ожидающее событие.

...