在 Scala 中,如果我使用 alive(0) 注册一个远程演员,该演员将在一个随机端口注册。我可以像这样进行注册: register('fooParActor, self) 在 act 方法中。
现在,在主服务器端,我可以通过提供端口来选择参与者。我是否需要手动扫描端口才能使用随机端口?
我要解决的问题是在一个节点上创建 n 个参与者,然后在主/服务器程序中选择它们,例如在节点 x 上启动 10 个从节点,并在节点 y 上获取 10 个远程参与者的列表。
这是怎么做到的?
在 Scala 中,如果我使用 alive(0) 注册一个远程演员,该演员将在一个随机端口注册。我可以像这样进行注册: register('fooParActor, self) 在 act 方法中。
现在,在主服务器端,我可以通过提供端口来选择参与者。我是否需要手动扫描端口才能使用随机端口?
我要解决的问题是在一个节点上创建 n 个参与者,然后在主/服务器程序中选择它们,例如在节点 x 上启动 10 个从节点,并在节点 y 上获取 10 个远程参与者的列表。
这是怎么做到的?
无需为演员注册各种端口。相反,您需要一个用于整个 actor 系统的端口——更准确地说是 akka 内核(服务器也需要知道)。有关所有这些如何详细工作,请参阅文档的此页面。
为了选择一个远程actor,你可以通过它在远程actor系统中的路径来查找它,类似于这样:
context.actorFor("akka://actorSystemName@10.0.0.1:2552/user/someActorName/1")
在这种情况下,您将创建n
演员作为演员的孩子,并为someActorName
他们命名(这样您就可以通过 获取其他演员,依此类推)。1
n
.../someActorName/2
.../someActorName/3
这里根本不需要随机化任何东西,鉴于您描述问题的方式,也不需要在其中进行随机化。您只需启动 10 个演员并将他们从 1 到 10 编号。任何随机数字只会使事情变得不必要地复杂化。
至于真正随机的端口,我只能同意 sourcedelica。您需要一个固定端口来与随机端口或其他一些通信方式进行通信。如果有人由于随机端口而不知道在哪里进行通信,那它根本就行不通。
您需要至少有一个具有众所周知端口的 ActorSystem。然后其他 ActorSystems 可以使用端口 0 让 Akka 分配一个随机端口。slave ActorSystems 将让 Actor 向 Master 上的 Actor 注册,因此它知道所有远程系统。
如果您绝对需要让您的主服务器使用随机端口,它将需要带外通信其端口(使用共享文件系统或数据库)。