使Akka为远程节点生成进程

时间:2017-01-12 15:51:14

标签: scala akka akka-remote-actor akka-remoting

我对Akka在创建演员系统时所承担的责任感到困惑。 我希望有一个父项和两个子actor的简单应用程序,其中每个子进程位于不同的进程(因此位于不同的节点上)。 现在我知道我可以使用带有远程配置的路由器或者只是启动一个远程actor,但是(并且如果我错了,请纠正我)在创建这个远程actor时,Akka期望该进程已经存在并且该节点已经在运行进程,然后它只将该子actor部署到该节点。 难道没有办法让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上运行main之后立即在Child.scala中运行这个main:

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

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

然后节点将连接。

如果没有任何办法,那么当进程崩溃时,Akka如何重启该进程/节点?

2 个答案:

答案 0 :(得分:1)

您负责创建,监控和重新启动actor系统。 Akka只对这些演员系统中的演员负责。

答案 1 :(得分:0)

这不仅不可能与Akka一起使用,但通常没有任何进程可以在不同的机器上生成新进程。如果可能,请考虑安全隐患!您始终需要在目标计算机上为您生成新进程的某些现有进程,例如sshd或某些资源/集群管理器。

因此,无密码SSH + shell脚本通常用于启动工作进程,例如Hadoop,Spark和Flink(顺便说一句,后两者使用Akka)。