通过路径获取多个akka Actor示例的ActorRef

o2gm4chl  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(169)

我正在创建一个相同执行元的示例池
稍后在我的应用程序中,我希望能够通过唯一路径引用参与者“池”的特定示例。

val instance1 = context.spawn(ActorA(), "actorA_1")
val instance2 = context.spawn(ActorA(), "actorA_2")
val instance3 = context.spawn(ActorA(), "actorA_3")
etc

这是在应用程序初始化时完成的,目标是允许应用程序的任何参与者引用此示例 * 如果它知道其唯一路径 *...
我想实现这样的目标:

val actorRef = getActorByItsUniquePath(path) 
actorRef ! sendMessage(...)

我不知道我是否需要使用经典的Actor API或类型化API(接待员),和/或我是否需要在HashMap上存储每个Actor示例的唯一路径(路径+ UID),并在以后检索该路径。
我在文件中没有找到任何明确的方向来实现这一点。

vfwfrxfs

vfwfrxfs1#

您位于正确的路径上。在标准执行元中,这是通过执行元选择和执行元路径完成的。请注意,“唯一路径”可能必须包括集群设置中的节点。
在键入的演员中,您将使用接待员和ServiceKey作为您的“唯一路径”。
因此,您不需要使用其中一个API:你应该根据自己的喜好使用传统的参与者或类型化的参与者。2只要根据你选择的API来选择发现方法(参与者路径或接收者)。
但是,我想补充一点。一般来说,最好不要这样做。这样做会有效地向客户公开实现细节。并且会减少一些灵活性/弹性。这在文档中有讨论:https://doc.akka.io/docs/akka/current/actors.html#identifying-actors-via-actor-selection下的“使用其他参与者的ActorRef而不是依赖于ActorSelection与其他参与者通信总是更可取的。例外情况是:“。这并不是说您绝对 * 不应该 * 这样做,因为参与者发现API的存在显然是有原因的。只是您应该“更喜欢”不依赖于通过唯一路径查找参与者,并且您应该有一个不使用路由器之类的东西的好理由。
编辑以回复评论:
你在下面的评论中说你将拥有具有相同路径的参与者示例,但是这是不可能的。每个示例都有一个唯一的路径。看起来你可能认为路径与参与者相关联,但实际上路径就是参与者示例。请参阅文档以及经典文档中关于命名参与者的部分,其中提到必须为每个示例给予一个唯一的名称。如果你没有显式地为示例指定一个唯一的名称,系统将自动生成一个。(例如/用户/我的演员/$1、/用户/我的演员/$2...)
如果您已经生成了一个uid,那么在生成示例时只需将其指定为示例的名称,您将得到一个如下所示的路径:akka://my-actorsystem@mynode:port/user/parentactor/youruid,您将能够使用该路径查找它。
你的情况真的没有那么不寻常。这是一个非常常见的模式,有许多相同参与者的示例,每个示例都维护状态。这也是为什么我提到使用路由器模式,因为这种设计有更大的灵活性。事实上,这也是Akka Sharding背后的基本模式。你可能想把它作为一个选项来研究,特别是如果你正在使用集群。
如果您使用Receptionist和键入的actor,它基本上与Receiptionist docs中显示的示例完全相同。每次创建新actor示例时,您都要使用register消息和您的uid密钥向Receptionist注册它。然后,您只需稍后使用Find消息查找它。由于Receptionist不强制执行唯一性,因此它会稍微复杂一些(不像路径),因为你必须知道类型(因此适应响应类型),但这就是接待员真正的作用:执行元示例的键-值存储,执行元示例实现为您向其发送消息的执行元。

  • 从技术上讲,actor路径对于 living actor示例是唯一的。理论上,您可以创建一个actor /user/foo,停止它,然后创建同名的第二个示例。但我不想把上面的解释复杂化,因为我认为细节在这里并不重要。

相关问题