我有以下情况,如下所示:
scala - 在层次结构上选择参与者的好方法?-LMLPHP

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

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

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

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

最佳答案

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或通过消息中发现ActorRefs。

关于scala - 在层次结构上选择参与者的好方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56395594/

10-10 11:57