【发布时间】:2013-09-14 05:10:38
【问题描述】:
我想做的是:
1) 在服务器上创建一个主actor,它可以在 10 台不同的机器上动态创建 10 个远程actor
2) 主actor将任务分配给10个远程actor
3) 当每个远程actor完成他们的工作时,他们将结果发送给主actor
4) 主actor关闭整个系统
我的问题是:
1) 我不知道如何配置主actor,下面是我的服务器部分代码:
class MasterAppliation extends Bootable{
val hostname = InetAddress.getLocalHost.getHostName
val config = ConfigFactory.parseString(
s"""
akka{
actor{
provider = "akka.remote.RemoteActorRefProvider"
deployment {
/remotemaster {
router = "round-robin"
nr-of-instances = 10
target {
nodes = ["akka.tcp://remotesys@host1:2552", "akka.tcp://remotesys@host2:2552", ....... akka.tcp://remotesys@host10:2552"]
}
}
}
remote{
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp{
hostname = "$hostname"
port = 2552
}
}
}""")
val system = ActorSystem("master", ConfigFactory.load(config))
val master = system.actorOf(Props(new master), name = "master")
def dosomething = master ! Begin()
def startup() {}
def shutdown() {
system.shutdown()
}
}
class master extends Actor {
val addresses = for(i <- 1 to 10)
yield AddressFromURIString(s"akka://remostsys@host$i:2552")
val routerRemote = context.actorOf(Props[RemoteMaster].withRouter(
RemoteRouterConfig(RoundRobinRouter(12), addresses)))
def receive = {
case Begin=>{
for(i <- 1 to 10) routerRemote ! Work(.....)
}
case Result(root) ........
}
}
object project1 {
def main(args: Array[String]) {
new MasterAppliation
}
}
2) 我不知道如何在远程客户端上创建远程参与者。我读了this tutorial。我需要 编写类似于服务器部分的客户端部分,这意味着我需要创建一个负责创建远程参与者的对象?但这也意味着当我运行客户端部分时,远程参与者已经创建!我真的很困惑。
3) 我不怎么关闭整个系统。在上面的教程中,我发现有一个名为shutdown()的函数,但我从未见过有人调用它。
这是我第一次用 Scala 和 AKKA 编写分布式程序。所以我真的需要你的帮助。 非常感谢。
【问题讨论】:
-
将配置中的
/remotemaster更改为/master/worker并将routerRemote更改为val routerRemote = context.actorOf(Props[RemoteMaster].withRouter(FromConfig()), name="worker") -
关于如何将多台机器与 AKKA 一起使用存在很多困惑。可能您不应该使用远程处理,而是使用集群。它使所有事情变得容易得多。
标签: scala akka distributed