Генерация команд при возникновении событий в Akka Persistence

Я реализую приложение 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)

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

Спасибо!


person Kamiel Wanrooij    schedule 29.07.2014    source источник
comment
Разве вам не лучше принять во внимание, что после обновления первого PersistentView вы больше не находитесь в сфере DDD и должны найти способ распространения изменений через ваши представления, специфичный для технологии Read-Model? Действительно ли эти события пересчета являются событиями в смысле слова DDD?   -  person guillaume31    schedule 01.08.2014
comment
Что ж, нет, вероятно, эти производные вычисления - это просто изменения состояния, которые происходят на основе первого события, а не события сами по себе. Я попытался сохранить исходные события в представлениях, чтобы я мог пересчитать производные значения, но это становится действительно утомительным после третьего или четвертого уровня производных значений (в основном все представления содержат полный моментальный снимок всех связанных данных в этой точке). .   -  person Kamiel Wanrooij    schedule 03.08.2014


Ответы (1)


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

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

person SeanW    schedule 12.08.2014