在层次结构上选择参与者的好方法吗?

时间:2019-05-31 12:59:32

标签: scala akka

我有以下情况,如下所示: enter image description here

我想将消息从 DetectorFSM 发送到 AppTriggerSupervisor (蓝色实线),问题是, 如何正确设计。

在角色 DetectorFSM 上获得 AppTriggerSupervisor 引用的最佳方法是什么?通过路径参考?如果通过参考,那么我必须以某种方式获取 AppTriggerSupervisor 的参考(通过参考 在初始化期间?)。

还是应该先将消息从 DetectorFSM 发送到 DetectorSupervisor (红色实线),然后再从那里发送到 AppTriggerSupervisor

但是主要问题是,我正在搜索最佳实践,以从不在同一节点上的参与者获取引用。例如, 例如上图的 AppTriggerSupervisor DetectorSupervisor AppTriggerSupervisor DetectorSupervisor 彼此不认识, 但我想在他们之间交换消息,那么如何彼此了解?

1 个答案:

答案 0 :(得分:1)

来自the docs

  

始终最好使用其ActorRef与其他Actor通信,而不是依赖ActorSelection。例外情况是

     
      
  • 使用“至少一次发送”功能发送邮件
  •   
  • 开始与远程系统的第一次联系
  •   
     

在所有其他情况下,都可以在Actor创建或初始化期间提供ActorRef,将其从父级传递给孩子或通过在消息内将其ActorRef发送给其他Actor来介绍Actor。

例如。您说 AppTriggerSupervisor DetectorSupervisor 彼此不认识,但是(间接)知道。它们都具有相同的父 IT系统。 AppTriggerSupervisor可以向其父发送消息“请给我DetectorSupervisor的ActorRef”。或者,也许更好的是,“请将此消息转发给最有能力处理此消息的人”。这样可以使您与Actor层次结构中的任何将来更改隔离开来,并具有很大的灵活性。

此外,ActorRefs指示存在(或至少曾经是)一个有效的actor。 ActorPath?很难知道,最好的办法是发送一个Identify消息,以便将其转换为ActorRef。

如果使用ActorPaths,则必须合并有关actor运行位置的信息,并假设可能存在远程位置。我的意思是,如果您正在使用ActorPath来“发现”您的参与者,那么您要么假设它是本地的(一个糟糕的假设,对于考虑到位置独立性设计的系统而言),要么您必须以某种方式抽象网络拓扑

此外,使用ActorPaths会使测试更加困难,因为actor的封装较少。当然,这并非不可能,但这意味着您必须知道被测试的Actor可能与之通信的路径,然后在这些路径上启动模拟Actor。而如果actor使用Props或其父级间接定位ActorRefs,则替换探针更容易。

我觉得上面的建议可能还有另外一两个例外,ActorSelection / ActorPaths有一些不错的功能,但是我强烈建议您从Props或通过消息中发现ActorRef。