我想将消息从 DetectorFSM 发送到 AppTriggerSupervisor (蓝色实线),问题是, 如何正确设计。
在角色 DetectorFSM 上获得 AppTriggerSupervisor 引用的最佳方法是什么?通过路径或 参考?如果通过参考,那么我必须以某种方式获取 AppTriggerSupervisor 的参考(通过参考 在初始化期间?)。
还是应该先将消息从 DetectorFSM 发送到 DetectorSupervisor (红色实线),然后再从那里发送到 AppTriggerSupervisor ?
但是主要问题是,我正在搜索最佳实践,以从不在同一节点上的参与者获取引用。例如, 例如上图的 AppTriggerSupervisor 和 DetectorSupervisor 。 AppTriggerSupervisor 和 DetectorSupervisor 彼此不认识, 但我想在他们之间交换消息,那么如何彼此了解?
答案 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。