2017-01-12 1 views
1

アクターシステムの作成時にAkkaがどのような責任を負うのか混乱します。 私は、各子が異なるプロセス(したがって異なるノード)に存在する親と2人の子アクターの単純なアプリケーションを作成したいと考えています。 リモートの設定でルータを使用することも、リモートアクタを起動することもできますが、このリモートアクタを作成する際に私が間違っていると私を修正することができます。Akkaは、プロセスが既に存在し、そのプロセスを実行し、その子アクターをそのノードにのみデプロイします。 Akkaを私たちのために産卵させる方法はありませんか?Akkaにリモートノード用のプロセスを作成させる

私は自分自身をプロセスを作成していないので、これが動作しないコードです:

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") 
    } 
} 

とChild.scala:

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

しかし、私は右Parent.scala上のメインを実行した後Child.scala内の主にこれを実行する場合:

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

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

その後ノードが接続されます。

これを実行する方法がない場合、プロセスがクラッシュしたときにAkkaがそのプロセス/ノードを再起動する方法はありますか?

答えて

1

あなたは、アクターシステムの作成、監視、および再起動を担当します。 Akkaは、これらの俳優システム内の俳優にのみ責任があります。

+0

ドキュメントにはリファレンスがありますか?私はそれがどこでも言及されて見たことがない –

+0

それは暗黙の文書です。 Akkaは、JVMの起動または再起動を処理しません。それは範囲外です。 – Ryan

+0

それゆえ、別のjvmsで子アクターを作成したいとしたら、自分自身でプロセスを生成しなければならないとします(そのプロセスは 'akka.remote.netty.tcpでActorSystem(" mySys ")を実行します)。ポート= 0')、親プロセスはそのプロセスが実行するポートをどのように知っているので、その上に子アクターを配置できますか?そのマネージャーワーカーの基本パターンを持つAkkaはリモートワーカーを抱えるケースを扱えません(従業員の数が動的なので、プロセスを先進的に開始することはできません) –

0

Akkaでは不可能なだけでなく、一般に、別のマシンに新しいプロセスを生成することはできません。可能であればセキュリティの影響を考えてみてください! sshdや一部のリソース/クラスタマネージャなど、新しいプロセスを生成するターゲットマシン上には、常に既存のプロセスが必要です。

したがって、パスワードなしのSSH +シェルスクリプトは、Hadoop、Spark、およびFlink(後者の2つは、Akkaをフードの下で使用している)などのワーカープロセスを開始するために通常行われる処理です。

関連する問題