2

我将 AKKA 2.1 与 Scala 2.10 一起使用。

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

但是,我需要一种方法让参与者系统在连接之前等待其他系统启动,否则我会出错。

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

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

4

3 回答 3

2

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

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

于 2013-11-22T18:00:28.967 回答
2

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

于 2013-02-21T15:00:21.640 回答
0

首先,actorSelection现在建议使用获取参与者引用的机制,尤其是通过网络。参见:Akka 文档

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

  • 一直打电话给那个大楼,直到鲍勃接电话。即发送一条消息尝试获取actorRef直到成功并处理错误
  • 让鲍勃到达时给你打电话。但这确实是一个问题 22,因为 Bob 也不知道你在你的大楼里。
  • 您可以引入一个“种子”actor 系统,所有其他actor 系统在创建时都隐含地知道该actor 系统,并且一旦actor 可用,每个actor 系统都会向该位置发送一条消息。这实际上将创建一个集中式存储库。
于 2013-11-22T16:04:07.657 回答