Внедрение 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. Надеюсь, он должен помочь читателям приземлиться в этом посте.