我是一个新手Akka开发人员,我刚刚开始远程。我经常看到这样的配置:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
deployment {
"/mainRepository/*" {
remote = "akka.tcp://MqttRemote@127.0.0.1:2553"
}
}
}
remote {
netty.tcp {
hostname = "127.0.0.1"
}
}
remote.netty.tcp.port = 2553
}
在中,参与者被命名,例如"mainRepository",但是如果我想创建未命名的远程参与者该怎么办?我应该在配置中指定什么?或者我可以通过在请求新参与者时不设置ActorSystem中的name参数来实现这一点吗?
还有,"*"字符是什么意思?或者在哪里可以了解更多关于远程配置的信息?(除了akka.io)
这个配置说的是,如果在路径/user/mainRepository/*
下创建了任何参与者实例(即,绑定到名称/user/mainRepository
的参与者实例的任何子实例),则不应该部署到本地ActorSystem
,而应该使用远程系统MqttRemote@127.0.0.1:2553
的远程守护进程在远程系统中部署该参与者。所以如果我这样写:
context.actorOf(Props[MyActor], "foo")
其中context
是mainRepository
actor实例的ActorContext
,那么该子实例将被远程部署。
*
是一个通配符,可以让您更一般地了解将远程部署哪些参与者。如果配置是这样的:
"/mainRepository/foo" {
remote = "akka.tcp://MqttRemote@127.0.0.1:2553"
}
那么只有绑定到名称foo
的子节点将被远程部署。mainRepository
actor的任何其他子actor都将部署到本地ActorSystem
中。
因此,使用这种方法,使用通配符,您确实可以创建未命名的子节点并远程部署它们,只要它们的父节点被正确命名,并且该名称被配置(如本例中)以远程部署它的子节点。
如果您不喜欢使用这种配置驱动的方法,您也可以通过编程方式远程部署actor实例。它看起来像这样:
import akka.actor.{ Props, Deploy, Address, AddressFromURIString }
import akka.remote.RemoteScope
val address = Address("akka.tcp", "RemoteSystem", "1.2.3.4", 1234)
val ref = system.actorOf(Props[MyActor].
withDeploy(Deploy(scope = RemoteScope(address))))
在上面的代码中,MyActor的一个实例将被部署在远程节点RemoteSystem@1.2.3.4:1234
上。
更多信息,可以参考Remoting文档