2015-06-11 3 views
3

Я прочитал книгу Patterns, Principles, and Practices of Domain-Driven Design Мне очень понравился подход к использованию DDD вместе с CQRS и Event Sourcing. Но у меня есть один вопрос. Как использовать DDD \ CQRS \ Event Sourcing можно получить исторические данные? Например. Я хотел бы написать службу, которая предоставляет информацию о погоде. Клиент может запрашивать данные службы. Например, Снимок погоды в Лондоне в прошлом году, шаг за шагом для рисования графики и клиента может подписаться на данные в реальном времени для обновления уже построенной графики. Вопрос. Как использовать DDD \ CQRS \ ES подход для отправки исторических данных клиенту, который запросил их. Я не могу отправить событие непосредственно на шину сообщений, потому что у службы может быть несколько клиентов, и не все клиенты нуждаются в этих данных.DDD CQRS Event Sourcing и запросить исторические данные

Обновление.

Я хотел бы показать в клиенте что-то вроде этого. enter image description here

+0

Это точка публикации событий и отправка команд. только заинтересованные могут слушать. вы также можете изучить возможность предоставления REST API, где вы можете позволить клиентам выбирать и управлять событиями, которые им интересны. – Marco

ответ

0

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

Как вы получаете текущий вид погоды? Загрузка всех погодных событий за все время для запрашиваемого местоположения?

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

По крайней мере, это мое понимание того, как это будет работать.

+0

Да.Я хотел бы загрузить все погодные события за определенный период для запрашиваемого местоположения, но как отправлять эти сообщения только одному клиенту, который сделал запрос, а не ко всем. – user45245

+0

@ пользователь45245 смотрите, пожалуйста, мое обновление. –

1

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

Постараюсь eleborate на вашем примере:

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

Можно было бы оставить другую базу данных, но это может быть решение представить запросы быстрее, потому что эта база данных (с его репликами) несет ответственность только для чтения в вашем приложении, в то время как ваш eventstore делает все тяжелый подъем (пишет).

+0

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

Смежные вопросы