2017-01-12 3 views
1

Je suis un peu confus quant à la responsabilité qu'Akka prend lors de la création d'un système d'acteur. Je veux avoir une application simple d'un parent et de deux acteurs enfants où chaque enfant réside sur un processus différent (et donc sur un nœud différent). Maintenant je sais que je peux utiliser un routeur avec une configuration distante ou simplement démarrer un acteur distant, mais (et corrigez-moi si je me trompe), Akka s'attend à ce que le processus existe déjà et que le nœud fonctionne déjà ce processus, puis son seul déploiement de cet acteur enfant à ce nœud. N'y a-t-il aucun moyen de faire Akka faire le frai pour nous?Faire Akka spawn un processus pour le noeud distant

C'est le code qui ne fonctionne pas parce que je ne l'ai pas créé moi-même le processus:

application.conf:

akka { 
    remote.netty.tcp.port = 2552 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
} 

child { 
    akka { 
    remote.netty.tcp.port = 2550 
    actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
    } 
    } 
} 

Parent.scala:

object Parent extends App{ 
    val system = ActorSystem("mySys") 
    system.actorOf(Props[Parent],"parent") 
} 

class Parent extends Actor with ActorLogging{ 


    override def preStart(): Unit = { 
    super.preStart() 
    val address = Address("akka.tcp", "mySys", "127.0.0.1", 2550) 
    context.actorOf(Props[Child].withDeploy(Deploy(scope = RemoteScope(address))), "child") 
    } 

    override def receive: Receive = { 
    case x => log.info(s"Got msg $x") 
    } 
} 

et Child.scala:

class Child extends Actor with ActorLogging{ 
    override def receive: Receive = { 
    case x=> //Ignore 
    } 
} 

Mais si je lance ce principal à l'intérieur Child.scala droit après l'exécution de la principale Parent.scala:

object Child extends App{ 
    ActorSystem("mySys", ConfigFactory.load().getConfig("child")) 
} 

class Child extends Actor with ActorLogging{ 
    override def receive: Receive = { 
    case x=> //Ignore 
    } 
} 

Ensuite, le nœud se connecter.

S'il n'y a aucun moyen de le faire, comment Akka peut-il redémarrer ce processus/noeud lorsque le processus est écrasé?

Répondre

1

Vous êtes responsable de la création, de la surveillance et du redémarrage des systèmes d'acteur. Akka est seulement responsable des acteurs au sein de ces systèmes d'acteurs.

+0

Avez-vous une référence dans la documentation? Je ne l'ai pas vu mentionné nulle part –

+0

C'est implicite dans les docs. Akka ne gère pas le lancement ou le redémarrage de JVM. C'est hors de portée. – Ryan

+0

Alors disons que je veux créer des acteurs enfants sur différents jvms, alors si je dois générer le processus moi-même (et ce processus lancera 'ActorSystem (" mySys ")' avec 'akka.remote.netty.tcp. port = 0') alors comment le parent saura-t-il sur quel port ce processus s'exécute afin qu'il puisse y déployer l'acteur enfant? il semble étrange qu'Akka qui a un modèle de base de gestionnaire-travailleurs ne gère pas le cas d'avoir des travailleurs à distance (où le nombre de travailleurs est dynamique afin que les processus ne peuvent pas être initiés à l'avance) –

0

Ce n'est pas seulement possible avec Akka mais en général, aucun processus ne peut générer un nouveau processus sur une machine différente. Pensez aux implications de sécurité si c'était possible! Vous avez toujours besoin d'un processus existant sur la machine cible qui génère le nouveau processus pour vous, par exemple sshd ou un gestionnaire de ressources/cluster. Donc, SSH + sans mot de passe, un script shell est une chose typiquement faite pour démarrer les processus de travail, par exemple, par Hadoop, Spark, et Flink (les deux derniers utilisant Akka sous le capot, soit dit en passant).