Кто отвечает за воссоздание экземпляра постоянного актора после сбоя JVM?

Я оцениваю, следует ли использовать Akka и akka Permanent в качестве ключевого инструментария определенного проекта, в котором есть сложный фоновый процесс (может запускаться Quartz в фиксированное время в день).

Фоновый процесс будет связываться со многими различными внешними службами через HTTP-связь, будет генерировать множество зашифрованных файлов локально и передавать их через SFTP.

С точки зрения бизнеса:

  • Сервис имеет решающее значение для миссии, примерно он автоматически спишет деньги N миллионов пользователей с их банковских карт и поможет им приобрести какой-либо продукт фонда.

С технической точки зрения:

  • Каждая внешняя служба может быть недоступна по какой-либо причине, например, из-за проблем с сетью, внешняя служба может исчерпать свои ресурсы (например, соединения jdbc).
  • Наш сервис может быть остановлен, перезапущен, повторно развернут из-за неотложной причины или аварийно завершен с некоторыми неожиданными ошибками.
  • После того как процесс был перезапущен с незавершенным заданием, его необходимо корректно завершить с помощью различных стратегий, таких как повтор, подтверждение бизнес-состояния внешней системы и возобновление с определенной контрольной точки.

Я читал официальный AkkaScala.PDF и некоторые видеоролики с конференций на YouTube, во всех из них упоминалось, что состояние актера можно восстановить, воспроизведя события из журнала после сбоя JVM.

Но это должен быть глупый вопрос, так как я не нашел, что он обсуждался:

Представьте, что в службе живет 1000 постоянных субъектов, а JVM службы аварийно завершает работу и перезапускается. Кто должен запускать повторное создание этих 1000 постоянных субъектов во вновь созданной системе субъектов как в режиме одиночного процесса, так и в кластерном режиме. ? И как? Или какие статьи следует прочитать в первую очередь?


person Barry Zhong    schedule 07.01.2017    source источник


Ответы (1)


Вы должны прочитать основы Akka Persistence и Akka Persistence Query. Но, наверное, первое, что приходит мне в голову, это использовать Akka Persistence Query AllPersistenceIdsQuery или CurrentPersistenceIdsQuery. Это даст вам все идентификаторы персистентности, которые вы можете использовать для повторного запуска ваших постоянных актеров. Постоянные акторы по определенным persistent id будут воспроизводить все события из журнала хранилища событий. Вы можете принять snapshots, чтобы ускорить выздоровление. Ваше хранилище событий, вероятно, будет какой-то базой данных (например, Cassandra). Учитывая, что ваш постоянный актор имеет определенное изменяемое состояние, он будет возвращен в свое последнее состояние после восстановления. Восстановление может занять некоторое время.

person Branislav Lazic    schedule 07.01.2017
comment
Добрый день, Бранислав, спасибо за ответ. Пока я читал часть *PersistenceIdsQuery, возникает подробный вопрос: кто создает экземпляр актера в соответствии с постоянным идентификатором? - person Barry Zhong; 08.01.2017
comment
Привет, Бранислав, можешь помочь мне с еще одним вопросом? stackoverflow.com/questions/42118395/ - person Barry Zhong; 08.02.2017