Я реализую приложение EventSourcing, которое обрабатывает большое количество исходных и производных точек данных. Короче говоря, у нас есть PersistentActor
, функционирующий как агрегированный корень, принимающий команды:
UpdateValue(name, value, timestamp)
UpdateValue(name, value, timestamp)
UpdateValue(name, value, timestamp)
После проверки этих команд они создают события, которые сохраняются и обновляют состояние:
ValueUpdated(name, value, timestamp)
ValueUpdated(name, value, timestamp)
ValueUpdated(name, value, timestamp)
В PersistentView
мы слушаем эти события и вычисляем производные значения:
case v @ ValueUpdated("value_i_care_about", _, _) => calculate_derived_values(v)
case v @ ValueUpdated("another_value_i_care_about", _, _) => calculate_derived_values(v)
Но этот пересчет сам по себе является новым значением, от которого могут зависеть другие представления, поэтому это означает, что мы должны отправить новую команду обратно в совокупный корень для обработки нового значения, которое может создавать события, которые могут быть захвачены этим или другим Просмотры.
Приемлемо ли для представления создавать события или команды? Я бы подумал, что ответственность представления - обновлять состояние на основе событий, а не создавать события или команды. Кроме того, порядок поступления событий может влиять на новые события, транслируемые во время воспроизведения.
Нужно ли вместо событий выдавать команды? Поскольку команда обновляла начальное значение, вы можете утверждать, что создание всех производных значений - это просто события, которые являются результатом обработки команды, хотя они генерируются распределенным образом, а не напрямую агрегированным корнем.
Я смотрел на реактивные потоки Akka, которые можно было бы использовать для объединения этих акторов вместе, а также смотрел на идею саг, представленную здесь: http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-i-of-ii/ < / а>. В этом посте Джонатан упоминает:
Саги слушают события и отправляют команды, в то время как агрегаты получают команды и публикуют события.
Это также кажется разумным подходом для реализации всех этих субъектов как конечных автоматов: ждать 5 секунд для связанных событий, пересчитывать все, отправлять команду, ждать 5 секунд для событий и т. Д.
Чтобы сделать вещи немного более интересными, потоки значений могут быть неупорядоченными и неполными, но должны давать производные значения в определенные моменты времени. Итак, если я получаю значения A и B:
- A1, B1, B2, A2, B3, A4, B4
он должен выдавать производные значения D:
- D1 (A1 * B1), D2 (B2 * A2), D3 (B3 * A2, нет A3), D4 (A4 * B4)
Это означает, что мне нужно следить за порядком и иногда перевыпускать производное значение, если приходит отсутствующее значение.
Спасибо!
PersistentView
вы больше не находитесь в сфере DDD и должны найти способ распространения изменений через ваши представления, специфичный для технологии Read-Model? Действительно ли эти события пересчета являются событиями в смысле слова DDD? - person guillaume31   schedule 01.08.2014