Akka супервайзер, управляющий супервайзерами

Я полагаю, что здесь может быть более широкий вопрос о разработке приложений с использованием Akka, но я спрошу, как настроить дерево наблюдения, где «ядро» или «верхний» руководитель может контролировать детей, которые являются другими руководителями, которые наблюдают за рабочими?


person Tim    schedule 02.05.2011    source источник
comment
Сделайте так, чтобы главный супервайзер порождал и связывал других супервайзеров, и пусть эти супервайзеры порождали и связывали рабочих.   -  person Viktor Klang    schedule 03.05.2011
comment
Спасибо, Виктор, вы знаете пример, который делает это программно, а не декларативно?   -  person Tim    schedule 03.05.2011
comment
Вам придется сделать это программно, проверьте это для документов: doc.akka.io/fault -толерантность-скала   -  person Viktor Klang    schedule 04.05.2011
comment
@Viktor: я преобразовал ваши предложения в ответ. Надеюсь, это нормально.   -  person Steffen    schedule 06.06.2011
comment
Если у меня будет время, я могу выложить пример на github. Я довольно успешно использовал эту настройку в java.   -  person chaostheory    schedule 23.06.2011


Ответы (1)


Вы можете начать с декларативного руководителя на верхнем уровне.

 val kernel = Supervisor(
     SupervisorConfig(
         OneForOneStrategy(List(classOf[Exception]), 3, 1000),
         Supervise(
             actorOf[Module1],
             Permanent) ::
         Supervise(
             actorOf[Module2],
             Permanent) ::
         Supervise(
             actorOf[Module3],
             Permanent) ::
         Nil
     )
 )

где модуль с 1 по 3 представляет следующий уровень архитектуры вашего приложения. Каждый модуль сам по себе является супервизором для всех своих дочерних акторов и реализован, например, как

class Module1 extends Actor {
   self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), 5, 5000)

   def receive = {
       case Register(actor) =>
       self.link(actor)
   }
}

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

Вы найдете более подробную информацию (как Виктор уже прокомментировал) в официальной документации akka по адресу Отказоустойчивость с помощью Scala или Отказоустойчивость с Ява.

person Steffen    schedule 06.06.2011
comment
Могу ли я предположить, что этот ответ не подходит для Akka 2.x? - person Erik Kaplun; 25.08.2012
comment
Правильно, это только Akka 1.x. Механизм наблюдения был полностью изменен в версии 2.x. - person Steffen; 29.09.2012