Akka演员扩展到JVM和服务器,例如akka.io

时间:2014-06-13 20:15:09

标签: akka akka-cluster

我发现介绍性example of Akka remoting supplied on the Akka landing page有点难以作为介绍,以及为了介绍目的而学习远程组织的来龙去除所需的文档长度。

以下是上述示例中的代码,我想请求描述该代码在某些公平的上下文中意味着什么,同时涉及是否可以远程发送任何行为者的问题,就好像它是本地只需要改变配置。关于this last bit的先前答案可能看起来与当前的Akka文档有些矛盾,而文档本身在这一点上有些不确定。

// ------------------------------
// config on all machines
akka {
 actor {
   provider = akka.remote.RemoteActorRefProvider
   deployment {
     /greeter {
       remote = akka.tcp://MySystem@machine1:2552
     }
   }
 }
}

// ------------------------------
// define the greeting actor and the greeting message
case class Greeting(who: String) extends Serializable

class GreetingActor extends Actor with ActorLogging {
  def receive = {
    case Greeting(who) ⇒ log.info("Hello " + who)
  }
}

// ------------------------------
// on machine 1: empty system, target for deployment from machine 2
val system = ActorSystem("MySystem")

// ------------------------------
// on machine 2: Remote Deployment - deploying on machine1
val system = ActorSystem("MySystem")
val greeter = system.actorOf(Props[GreetingActor], name = "greeter")

// ------------------------------
// on machine 3: Remote Lookup (logical home of “greeter” is machine2, remote deployment is transparent)
val system = ActorSystem("MySystem")
val greeter = system.actorSelection("akka.tcp://MySystem@machine2:2552/user/greeter")
greeter ! Greeting("Sonny Rollins")

因此,对此示例代码的介绍性解释也会对上述关键方面进行处理,这将非常有用。这个解释应该有希望能够选择一个可以在一个JVM内轻松扩展并跨越JVM和服务器边界的actor体系结构,而不是在几天内进入实验模式。

谢谢!

1 个答案:

答案 0 :(得分:3)

最容易解释您从下到上发布的示例。最后,它显示了香草位置透明度,以获得一个演员参考,我们不会硬编码位置字符串。通过这个小修改我们得到:

// ------------------------------
// on machine 3: Remote Lookup (logical home of “greeter” is machine2, remote deployment is transparent)
val system = ActorSystem("MySystem")
val greeter = system.actorSelection(uri) // where uri is from config or some directory
greeter ! Greeting("Sonny Rollins")

如何从配置中查找演员的位置显示在can a lookup an akka actor address from configuration?,它总结了使用演员的位置透明度。一旦你通过uri的选择获得了ActorRef,你就不需要知道它是一个本地的还是一个远程的演员,你可以发信息。

向上移动示例:

// ------------------------------
// on machine 2: Remote Deployment - deploying on machine1
val system = ActorSystem("MySystem")
val greeter = system.actorOf(Props[GreetingActor], name = "greeter")

这是为了展示部署演员的本地透明度。 actorOf是工厂实例化而不是查找,因此它是一个部署。 name属性将其部署到" / user / greeter"的uri路径。如果您有一个jvm配置(例如空配置)并在单个进程中运行它,您将获得部署到单个jvm中的本地actor。然而,示例评论说它在machine2上运行并部署到machine1;这是因为每个jvm的配置都在文件的上方:

akka {
 actor {
   provider = akka.remote.RemoteActorRefProvider
   deployment {
     /greeter {
       remote = akka.tcp://MySystem@machine1:2552
     }
   }
 }
}

那就是说用户空间" / user / greeter"将使用RemoteActorRefProvider远程部署到machine1上的actor系统MySystem。如果您取出该配置,那么要部署的示例代码将不会进行远程部署,而是进行本地部署。如果它是本地部署,您可以使用本地路径查找它,而不会将完整的uri指向它实际部署到的系统。无论是本地部署还是远程部署,您都会获得ActorRef并向其发送消息。

在以下文件中向上移动文件:

// ------------------------------
// on machine 1: empty system, target for deployment from machine 2
val system = ActorSystem("MySystem")

这只是告诉你,如果你有配置,将在位置" greeter"远程部署演员。进入" MySystem"在machine1上然后你​​应该在machine1上启动一个名字与配置匹配的actor系统。如果不是,您将尝试部署或解决" greeter"来自其他机器。

最后,演员本身的位置是透明的,因为它没有任何关于位置的内容,如下所示:

// ------------------------------
// define the greeting actor and the greeting message
case class Greeting(who: String) extends Serializable

class GreetingActor extends Actor with ActorLogging {
  def receive = {
    case Greeting(who) ⇒ log.info("Hello " + who)
  }
}

因此,演员不知道它是本地演员还是远程演员,或者是否正在使用akka Testkit进行单元测试。实际上,在所有机器中部署的配置文件正在修改演员系统的工厂行为以部署到位置" greeter"进入一台机器。