Akka Durable State восстановление

У меня есть существующее приложение Akka Typed, и я рассматриваю возможность добавления поддержки постоянных субъектов с помощью функции Durable State. В настоящее время я не использую сегментирование кластера, но планирую реализовать его в будущем (после внедрения устойчивого состояния).

Я прочитал документацию о том, как реализовать Durable State для сохранения состояния актера, и все это имеет смысл. Однако в этом документе, похоже, нет никакой информации о том, как/когда восстанавливается состояние актера, и я не совсем понимаю, что мне нужно сделать, чтобы восстановить сохраненные актеры при перезапуске всей службы.

Моя текущая архитектура состоит из службы HTTP (использующей AkkaHTTP), субъекта «диспетчера» (который является субъектом-хранителем ActorSystem и в настоящее время является синглтоном) и N числа «рабочих» акторов, которые являются дочерними элементами диспетчера. И субъект-диспетчер, и рабочий субъект имеют состояние.

Состояние актора-диспетчера содержит карту requestId->ActorRef. Когда от службы HTTP поступает новый запрос задания, актор-диспетчер создает рабочий актор и сохраняет его ссылку на карте. Будущие запросы с тем же идентификатором запроса (т. е. запросы о состоянии и результатах) перенаправляются диспетчером соответствующему рабочему субъекту.

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

Чего я хочу добиться при перезапуске службы, так это воссоздания диспетчера с его последним сохраненным состоянием. Все рабочие акторы, которые были на рабочей карте диспетчера, также должны быть восстановлены с их последними сохраненными состояниями. Я не уверен, насколько это происходит автоматически, просто путем рефакторинга моих субъектов как постоянных субъектов с использованием устойчивого состояния, и что мне нужно сделать явно.

Вопросов:

  1. При перезапуске, если я создам диспетчера (хранителя) с тем же именем, достаточно ли этого, чтобы Akka знала, чтобы восстановить свое постоянное состояние, или мне нужно сделать что-то более явное, чтобы сказать ему это сделать?
  2. Поскольку постоянные акторы требуют, чтобы состояние было сериализуемо, будет ли это работать с тем фактом, что рабочая карта диспетчера ссылается на рабочих с помощью ActorRef? Являются ли они сериализуемыми, или мне нужно переключить его, чтобы ссылаться на них по имени?
  3. Если я оставлю ссылки на рабочие акторы как ActorRefs, а служба будет перезапущена, будут ли те ActorRefs (которые были восстановлены как часть постоянного состояния диспетчера) продолжать работать, и будут ли автоматически восстановлены постоянные состояния рабочих акторов? Или, опять же, мне нужно сделать что-то явное, чтобы сказать ему оживить этих акторов и восстановить их состояния.
  4. В настоящее время, поскольку все рабочие акторы не сохраняются, я предполагаю, что все их состояния хранятся в памяти. Это правда? В настоящее время я держу всех рабочих на неопределенный срок, чтобы результаты их работы (которые являются частью их состояния) можно было получить в будущем. Однако меня беспокоит нехватка памяти на сервере. Я хотел бы, чтобы рабочие, которые выполнили свою работу, могли сохраняться только на диске, своего рода «усыпляя их», чтобы результаты их работы можно было получить в будущем, не занимая память, дней или недель спустя. Я хотел бы иметь контроль над тем, когда актер находится «в памяти», а когда он «только на диске». Может ли постоянство Durable State служить для этого механизмом? Если да, то могу ли я убить актера, а затем оживить его по требованию (и восстановить его состояние), когда мне это нужно?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Устойчивое состояние сохраняется с ключом akka.persistence.typed.PersistenceId. Между именем субъекта и его идентификатором сохраняемости нет необходимой связи.

ActorRef являются сериализуемыми (включенные сериализации Джексона (CBOR или JSON) делают это из коробки; если вы используете собственный сериализатор, вам нужно будет использовать ActorRefResolver), хотя в случае персистентности это не обязательно это полезно: нет гарантии, что актор, на который указывает ссылка, все еще существует (рассмотрите, например, если JVM, на котором размещена эта система акторов, остановилась между моментом сохранения состояния и его считыванием).

Непостоянные акторы (при условии, что они сами напрямую не взаимодействуют с каким-либо постоянным хранилищем данных: ничто не мешает вам иметь актора, который считывает состояние при запуске откуда-то еще (возможно, сохраняет входящие команды до завершения чтения) и записывает изменения состояния. .. вот в принципе все устойчивые состояния находятся под капотом) держите все свои состояния в памяти, пока их не остановят. Механизм остановки актера обычно называется «пассивацией»: в типизированном виде у вас обычно есть команда Passivate в протоколе актера. Возвращение его затем часто называют «регидратацией». И постоянство на основе событий, и постоянство с устойчивым состоянием очень полезны для реализации этого.

Обратите внимание, что абсолютно возможно запустить Akka Cluster с одним узлом и иметь сегментирование. Разделение приносит понятие «сущности», которая имеет строковое имя и концептуально бессмертна/вечна (в отличие от актера, у которого есть определенный жизненный цикл от рождения до смерти). Затем при шардинге данная сущность воплощается не более чем одним актором в любой момент времени в кластере (я игнорирую случай с несколькими центрами обработки данных: если используется несколько центров обработки данных, вам, вероятно, понадобится постоянство, основанное на событиях). Как только вы получите EntityRef из шардинга, EntityRef будет относиться к текущему воплощению: если сообщение отправлено EntityRef, а живого воплощения нет, будет создано новое воплощение. Если поведение для этого TypeKey, которое было предоставлено для сегментирования, является постоянным поведением, то постоянное состояние будет восстановлено. Разделение также может напрямую реализовать пассивацию (с поддержкой нескольких готовых стратегий).

Аналогичный функционал вы можете реализовать самостоятельно (для ситуаций, когда дочерних элементов диспетчера немного, подойдет простая карта в диспетчере и запросы/отслеживания).

Учебное пособие Akka Platform Guide работает на примере использования сегментирования кластера и сохраняемости (в данном случае это источник событий, но API-интерфейсы устойчивого состояния в основном одинаковы, особенно если вы игнорируете биты CQRS).

Другие вопросы по теме