gpt4 book ai didi

scala - 如何使用 AKKA 动态创建远程角色并控制它们

转载 作者:行者123 更新时间:2023-12-04 02:19:08 26 4
gpt4 key购买 nike

我想做的是:

1)在服务器上创建一个主actor,它可以在10台不同的机器上动态创建10个远程actor

2) master actor 将任务分发给 10 个远程 actor

3)当每个远程 Actor 完成他们的工作时,他们将结果发送给主 Actor

4) master 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 编写分布式程序。所以我真的需要你的帮助。
非常感谢。

最佳答案

第一次设置整个事情是一件痛苦的事情,但如果你做了一次,你就会有一个很好的骨架,你会定期使用它。

我在问题用户集群不远程处理下面的评论中写道。

这是我如何做到的:
我建立了一个包含三个子项目的 sbt 根项目。

  • 普通
  • 前端
  • 后端

  • common你把两个项目共有的所有东西都放在一起,例如他们共享的消息,在前端创建并部署到后端的参与者类。

    放一个 reference.conf对于共同项目,这是我的:
    akka {
    loglevel = INFO
    actor {
    provider = "akka.cluster.ClusterActorRefProvider"
    debug {
    lifecycle = on
    }
    }

    cluster {
    seed-nodes = [
    "akka.tcp://application@127.0.0.1:2558",
    "akka.tcp://application@127.0.0.1:2559"
    ]
    }

    }

    现在在前端:
    akka {


    remote {
    log-remote-lifecycle-events = off
    netty.tcp {
    hostname = "127.0.0.1"
    port = 2558
    }
    }

    cluster {
    auto-down = on
    roles = [frontend]
    }
    }

    和后端
    akka {

    remote {
    log-remote-lifecycle-events = off
    netty.tcp {
    hostname = "127.0.0.1"
    port = 0
    }
    }

    cluster {
    auto-down = on
    roles = [backend]
    }
    }

    这将像这样工作:
    您首先启动将控制集群的前端部分。
    然后您可以启动任意数量的后端,这些后端将自动加入(查看端口,它是 0,因此它将被随机选择)。

    现在您需要将整个逻辑添加到前端 main 中:
    创建名为 application 的actor系统:
    val system = ActorSystem("application")
    在后端主要做同样的事情。

    现在在前端编写代码,以便使用路由器创建工作线程,这是我的示例代码:
    context.actorOf(ServiceRuntimeActor.props(serviceName)
    .withRouter(
    ClusterRouterConfig(ConsistentHashingRouter(),
    ClusterRouterSettings(
    totalInstances = 10, maxInstancesPerNode = 3,
    allowLocalRoutees = false, useRole = Some("backend"))
    )
    ),
    name = shortServiceName)

    只需更改您的 ServiceRuntimeActor到你的 worker 的名字。它会将工作人员部署到您已启动的所有后端,并将其限制为每个节点最多 3 个,总共最多 10 个。

    希望这会有所帮助。

    关于scala - 如何使用 AKKA 动态创建远程角色并控制它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798531/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com