等待akka actor系统变得可用

时间:2013-02-21 10:25:07

标签: events scala akka actor remote-actors

我正在使用AKKA 2.1和Scala 2.10。

我需要多台机器来启动actor系统并实例化一些actor。在此之后,每个系统都需要访问所有其他系统并使用“actorFor(...)”收集对其actor的引用。

但是,我需要一种方法让一个actor系统在连接之前等待其他系统启动,否则我会收到错误。

如果演员系统A在B离线时连接到B,我的程序将失败。但是,如果A连接到B并在B上存在之前获得远程actor引用,则一旦B实际实例化actor,程序就会继续。

简而言之,在尝试连接之前,我需要以某种方式等待B上的创建事件。在Scala + AKKA中有一个很好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可能希望查看Akka的群集支持。它允许您在其他计算机加入群集并可用于通信时侦听事件。

答案 1 :(得分:2)

99%的时间解决人们的问题会让你与演员解决问题。 想象一下它是建筑物(ActorSystems)和人物(演员)。

您可以创建一个“接待员”演员,该演员在ActorSystem启动时创建(Akka Extensions可以配置为在ActorSystem启动时加载)在“/ user / receptionist”之类的公共路径下然后告诉接待员挂钩当他/她上线时你和演员X / Y / Z,然后让X / Y / Z与接待员注册。 因此,如果外部演员要求X / Y / Z不存在,它会将请求存储到某个超时或X / Y / Z“报告”。

答案 2 :(得分:0)

首先,actorSelection现在是获取参与者参考的建议机制,尤其是在整个网络中。见:Akka Docs

这在异步和分布式系统中是一个非常重要的问题。 akka集群支持使用从其类似Dynamo的框架中采用的各种机制。如果你想象你的每个演员都是人,每个演员系统都是建筑物中的人,那么你的任务就像询问鲍勃是否已进入街对面的建筑物。你可以:

  • 继续打电话给那栋楼,直到鲍勃开始。即发送一条消息,试图获得actorRef直到成功并处理错误
  • 当他到达时让bob给你打电话。但这真的是一个问题22,因为鲍勃不知道你在你的大楼里。
  • 您可以引入一个“种子”演员系统,所有其他演员系统在创建时都会隐式知道,并且每当演员可用时,每个系统都会向该位置发送一条消息。这实际上会创建一个集中的存储库。