В системе CQRS как мне показать пользователю, что его запрос получен? - PullRequest
2 голосов
/ 05 ноября 2011

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

Типичный пример: когда клиент размещает заказ, в данный момент мы блокируем его поток, пока заказ отправляется на оплату, утверждается системой продаж и т. Д. И т. Д.

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

Другими словами - они размещают заказ.Их заказ идет в очередь.Если они снова войдут в свою учетную запись через пять секунд и нажмут «просмотреть заказы» - что произойдет?

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

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

Какие шаблоны или решения мне следует искать, чтобы помочь с этим?

Ответы [ 4 ]

5 голосов
/ 05 ноября 2011
  • Что-то, на что стоит обратить внимание, - это папка «Пользователь»: место в вашем приложении, с которым пользователь может обращаться к командам «в процессе».Вы также можете «отправлять» уведомления обратно в пользовательский интерфейс пользователя, когда он уже перешел на другой экран, но все еще находится в вашем приложении.Это также может быть вариантом, когда пользователь снова входит в систему.
  • Другим вариантом может быть симуляция синхронного взаимодействия, то есть ожидание и опрос, пока в фоновом режиме все происходит асинхронно.Конечно, это может включать и тайм-ауты, но я бы сказал, что они также используются в современной синхронной обработке.
  • Помимо всего этого, вы можете захотеть как сообщить, так и запросить обратную связь с вашей стороны.пользователи о том, как они воспринимают ваше приложение и его поведение.
  • Независимо от того, что вам скажут, если вы хотите справиться с этим элегантно, это потребует некоторых усилий с вашей стороны.
3 голосов
/ 06 ноября 2011

Лучше всего врать!

Пользователь не должен знать, что его транзакция на самом деле похожа на кота Шредингера, живого или мертвого.С их точки зрения транзакция прошла успешно, потому что вы просто указываете им, что она прошла успешно, и ставите задачу в очередь для автономной обработки.

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

2 голосов
/ 07 ноября 2011

Незначительные случаи, например, изменение какой-либо записи:

  1. Отправьте пользователю страницу подтверждения, сообщив ему что-то вроде «Спасибо, ваш ввод обрабатывается.Что вы хотите делать дальше?"и пару ссылок.
  2. Если вам абсолютно необходимо отправить пользователя обратно к отредактированной записи или ее списку, в нераспределенных системах мы, вероятно, говорим о миллисекундах, пока хранилище чтения не будет обновлено.Пока перенаправление пользователя на новую страницу занимает больше времени, из POV пользователя все в порядке.
  3. Если в некоторых случаях пользователь фактически не видит свое обновление «немедленно», он может вызвать службу поддержки пользователей.,Они говорят ему, чтобы ударить F5.Какие?Это там сейчас?Большой!Угадайте, что он делает в следующий раз, прежде чем дотянуться до телефона.

Значительные случаи, например, обработка заказов в автономном режиме:

Может существовать неявная концепция* Полученный заказ или Отложенный заказ в вашем домене.Если вы сделаете эту концепцию явной, вы можете предоставить пользователю точную информацию.

"Большое спасибо! Ваш заказ был получен, и мы будем держать вас в курсе, как только он будет отправлен. [Нажмите здесь]чтобы увидеть список ваших отложенных ордеров ... "

1 голос
/ 05 ноября 2011

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

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

...