Акка актер Убить / перезапустить поведение

Меня смущает поведение, которое я вижу в Акке. Вкратце, у меня есть набор актеров, выполняющих научные расчеты (моделирование звездообразования). У них есть какое-то состояние. Когда возникает ошибка, из-за которой один или несколько человек входят в недопустимое состояние, я хочу перезапустить весь набор, чтобы начать сначала. Я также хочу сделать это, если один калькулятор (по всему набору) занимает слишком много времени (невозможно заранее предсказать, как долго он может работать).

Итак, в нижней части дерева есть набор акторов симуляции, а над ними - директор (который создает их через маршрутизатор и также отправляет им сообщения через этот маршрутизатор). Еще один уровень Директоров выше, чтобы создавать Директоров на разных машинах и собирать результаты с них всех.

Я обрабатываю случай тайм-аута с помощью планировщика Akka для создания одноразового события тайм-аута в локальном директоре при запуске симуляции. Когда Директор получает это событие, если все его актеры Симуляции не закончили, он делает это:

children ! Broadcast(Kill)

где children - Маршрутизатор, который владеет / создал их - это отправляет Kill всем дочерним элементам (SimulActors).

Я думал, что произойдет, что все детские актеры будут перезапущены. Однако их метод ловушки preRestart () никогда не вызывается. Я вижу полученное сообщение Kill, но это все.

Я должен упустить что-то фундаментальное здесь. Я прочитал документы Akka на эту тему и должен сказать, что нахожу их не совсем понятными (особенно на странице "Супервизоры"). Буду очень признателен за подробное объяснение процесса Kill /restart или просто за некоторые другие ссылки (Google не очень помог).

2 ответа

Решение

Заметка

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

Взято из документов akka.

Я хотел бы рассмотреть возможность использования стратегии надзора - в akka встроено поведение для убийства всех участников (все для одной стратегии), и вы можете определить конкретную стратегию - например, перезапустить.

Я думаю, что более идиоматический способ выполнить это - заставить актеров выдать x исключение, если они не сделали этого через некоторое время, а затем супервизор справится с этим с помощью стратегии надзора.

Вы можете выдать исключение not done из потомка и затем определить поведение следующим образом:

override val supervisorStrategy =
    AllForOneStrategy(maxNrOfRetries = 0) {
      case _: NotDoneException      ⇒ Stop
      case _: Exception     ⇒ Restart
    }

Важно понимать, что перезапуск означает остановку старого актера и создание нового отдельного объекта / актера

Рекомендации:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html

http://doc.akka.io/docs/akka/snapshot/general/supervision.html

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