【问题标题】:Select remote actor on random port在随机端口上选择远程参与者
【发布时间】:2013-01-19 03:20:04
【问题描述】:

在 Scala 中,如果我使用 alive(0) 注册一个远程演员,该演员将在一个随机端口上注册。 我可以像这样进行注册:在 act 方法中注册('fooParActor,self)。

现在,在主服务器/服务器端,我可以通过提供端口来选择参与者。我是否需要手动扫描端口才能使用随机端口?

我要解决的问题是在一个节点上创建 n 个参与者,然后在主/服务器程序中选择它们,例如在节点 x 上启动 10 个从站,并在节点 y 上获取 10 个远程参与者的列表。

这是怎么做到的?

【问题讨论】:

    标签: scala networking port actor remoteobject


    【解决方案1】:

    无需为演员注册各种端口。相反,您需要一个用于整个 actor 系统的端口——更准确地说是 akka 内核(服务器也需要知道)。请参阅文档的this page,了解所有这些工作的详细信息。

    为了选择一个远程actor,您可以通过它在远程actor系统中的路径查找它,类似于这样:

    context.actorFor("akka://actorSystemName@10.0.0.1:2552/user/someActorName/1")
    

    在这种情况下,您将创建 n 演员作为 someActorName 演员的子代,并将其名称命名为 1n(这样您就可以通过 .../someActorName/2、@987654331 获得其他演员@ 等等)。

    这里根本不需要随机化任何东西,鉴于您描述问题的方式,也不需要随机化。您只需启动 10 个演员并从 1 到 10 对其进行编号。任何随机数字都会使事情变得不必要地复杂化。

    至于真正随机的端口,我只能同意 sourcedelica。您需要一个固定端口来与随机端口或其他一些通信方式进行通信。如果由于随机端口而导致某人不知道与哪里通信,它根本就无法工作。

    【讨论】:

    【解决方案2】:

    您需要至少有一个具有已知端口的 ActorSystem。然后其他 ActorSystems 可以使用端口 0 让 Akka 分配一个随机端口。 slave ActorSystems 将让 Actor 向 Master 上的 Actor 注册,因此它知道所有远程系统。

    如果您绝对需要让您的主服务器使用随机端口,它将需要带外通信其端口(使用共享文件系统或数据库)。

    【讨论】:

    • 我想象在集群中的同构机器上运行程序,所以他们只需要就工作端口达成一致。一旦找到,他们就可以通过网络文件系统轻松地进行通信。随机端口可用吗?
    • 是的,如果您使用端口 0 进行远程配置,那么 Akka 将分配一个随机端口(参见 doc.akka.io/docs/akka/2.1.0/general/…,akka.remote.netty.port 条目)。在您的主服务器上,您可以将此端口 # 写入网络文件系统文件,以便从服务器可以连接。请参阅我在stackoverflow.com/questions/14288068/… 的回答,了解如何获取本地actor 系统的端口。
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多