2013-02-21 55 views
2

我使用AKKA 2.1和Scala 2.10。等待阿卡角色系统变得可用

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

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

如果演员系统A在B离线时连接到B,则我的程序将失败。但是,如果A连接到B并在B上存在远程参与者引用之前获得它,那么一旦B真正实例化参与者,程序就会继续正常工作。

简而言之,我需要以某种方式等待B的创建事件,然后再尝试连接它。有没有在Scala + AKKA中做到这一点的好方法?

+0

您可以在演员身上看到成为/不受欢迎的人,并在您的服务可用时发送消息。 – twillouer 2013-02-21 11:11:57

回答

2

您可能想查看Akka的群集支持。它允许您在其他机器加入群集并可用于通信时监听事件。

+0

我不太喜欢使用实验性群集支持。标准的远程演员系统真的没有办法做到这一点吗? – Felix 2013-02-23 13:14:54

+0

事情有所改善 - 在目前的稳定版本(2.2.3)集群不是实验性的。 – 2013-11-26 16:30:16

0

首先,actorSelection现在是建议获取参与者参考的机制,特别是在整个网络中。请参阅:Akka Docs

这是异步和分布式系统中的一个不平凡的问题。 akka集群支持使用从其类似发电机的框架中采用的各种机制。如果你想象你的每个演员都是人,并且每个演员系统都是建筑物中的人,那么你的任务类似于问鲍勃是否已经进入街对面的建筑物。你可以:

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

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

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