Внедрение CQRS + Event Sourcing с использованием akka-persistence
Я хочу использовать функцию поиска событий akka-persistence, чтобы реализовать идею CRQS + Event Sourcing в моем новом проекте. Проблема заключается в том, что помимо документации (http://doc.akka.io/docs/akka/snapshot/scala/persistence.html) я не мог найти хороших примеров или рекомендаций, как подойти к ней. Документация замечательна с точки зрения объяснения всех строительных блоков архитектуры, таких как процессоры, представления, каналы, но не объясняет, как их собрать.
Итак, возникает вопрос: как я должен подключить модель записи с моделями чтения в akka-persistence? Я придумал три варианта:
-
Прямое подключение EventsourcedProcessor → View, представление получает все события непосредственно из журнала. Похоже, это самое простое решение, но мне интересно, можем ли мы распределять процессор и просматривать на разных узлах, используя этот подход.
-
EventsourcedProcessor → Channel → View/normal Actor. В чем разница с первым вариантом? Если это правильное решение, почему у нас есть Views в блоках akka-persistence? Должен ли я использовать Каналы или PersistentChannels?
-
EventsourcedProcessor → какая-то шина событий (например, context.system.eventStream) → Views/Actors.
Каков наилучший способ и почему?
Ответы
Ответ 1
EventsourcedProcessor → Просмотр - способ сделать это. Представление воспроизводится из журнала, поэтому для размещения представления на другом компьютере вам нужен распределенный журнал. Список реализации журнала можно найти здесь: http://akka.io/community/
Ответ 2
Мне также было трудно найти хорошие примеры того, как подойти к Акка-Стойкости и Существованию событий. Поэтому я создал это примерное приложение, используя Dropwizard и Akka Persistence, akka-persistence-java-example
В этом примере используется PersistenceActor для записи данных и PersistenceQuery для чтения данных.
Ответ 3
В то время как я думаю, что чтение из журнала EP - отличный способ восстановить/перестроить представление, похоже, это опрос журнала (akka.persistence.view.auto-update-interval). Это было бы нецелесообразно, если бы хотелось, чтобы синхронные обновления модели чтения (которые некоторые из них предложили, могут быть хорошей отправной точкой для моделей чтения). Я бы предложил (и хотел бы использовать себя) журнал для восстановления, но имел какую-то архитектуру pub-sub для живых событий. Я знаю, что это может быть очень сложно, но кажется, что это правильно. Тем не менее, я недостаточно осведомлен, чтобы предложить, как сделать распределенный pub-sub с Akka Persistence или другими библиотеками или даже уверен, действительно ли это действительно так.
В качестве альтернативы было бы возможно, чтобы уведомления были уведомлены, когда обновляются журналы, которые они отслеживают?
Ответ 4
В этой теме есть действительно хорошая дискуссия. Я просто вставляю вывод https://groups.google.com/forum/#!topic/akka-user/MNDc9cVG1To. Надеюсь, он должен помочь читателям приземлиться в этом посте.