1

我对 Akka 在创建演员系统时承担的责任感到有点困惑。我想要一个父和两个子actor的简单应用程序,其中每个子actor驻留在不同的进程上(因此在不同的节点上)。现在我知道我可以使用带有远程配置的路由器或者只是启动一个远程参与者,但是(如果我错了,请纠正我)在创建这个远程参与者时,Akka 期望该进程已经存在并且节点已经在其上运行进程,然后它只将该子actor部署到该节点。没有任何方法可以让 Akka 为我们产卵吗?

这是不起作用的代码,因为我自己没有创建该过程:

应用程序.conf:

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

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

父级.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 如何重新启动该进程/节点?

4

2 回答 2

1

您负责创建、监控和重新启动参与者系统。Akka 只对那些 Actor 系统中的 Actor 负责。

于 2017-01-12T16:20:06.687 回答
0

Akka 不仅不可能,而且通常没有进程可以在不同的机器上生成一个新进程。如果可能的话,考虑一下安全隐患!您总是需要目标机器上的某个现有进程为您生成新进程,例如sshd某个资源/集群管理器。

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

于 2017-06-23T06:53:57.860 回答