在Akka文档(https://doc.akka.io/docs/akka/current/general/addressing.html)中,每个文件的定义都是
逻辑演员路径:通过跟随父监督链接到根监护人获得的唯一路径称为逻辑演员路径。此路径与actor的创建祖先完全匹配,因此只要设置了actor系统的远程配置(以及路径的地址组件),它就完全确定了。
物理角色路径:虽然逻辑角色路径描述了一个角色系统中的功能位置,但基于配置的远程部署意味着可以在不同的网络上创建 角色主机比其父主机,即在不同的演员系统内 。在这种情况下,遵循来自根监护人的actor路径需要遍历网络,这是一项代价高昂的操作。因此,每个actor也有一个物理路径,从实际actor对象所在的actor系统的根守护者开始。在查询其他actor时使用此路径作为发送者引用将允许他们直接回复此actor,从而最大限度地减少路由引起的延迟。
我的问题是: 一个演员及其父母如何能够存在于不同的演员系统中? 有人请说明如何理解物理路径?我基于阅读Akka文档(https://doc.akka.io/docs/akka/current/general/actor-systems.html)对演员系统的理解是,每个演员系统都以一个根演员,然后是其子演员,然后是其孙子演员开始。因此,根据定义,每个演员的父母都驻留在同一个演员系统中。也许这是我对演员系统定义的理解是关闭的?
答案 0 :(得分:1)
该声明有什么问题?可以分发Actor,这意味着它可以位于同一主机上或完全不同的主机上。根据孩子的位置,您可以执行以下操作之一:
"akka://my-sys/user/service-a/worker1" // purely local
"akka.tcp://my-sys@host.example.com:5678/user/service-b" // remote
如果您担心远程监督,它只会像当地监督一样工作。看看这里的文档:
https://doc.akka.io/docs/akka/2.5.4/scala/remoting.html#watching-remote-actors
答案 1 :(得分:1)
首先,重要的是要注意Akka的设计明确考虑了Location Transparency。因此,它被设计为能够在几个不同“节点”的集群上运行(即,在不同的物理机器上运行或包装到不同的虚拟机中的不同JVM实例),代码中的变化很小甚至没有变化。例如,您可以configure Akka在远程计算机上创建一些Actors,也可以从code执行相同操作。在Akka文档中,“Actor系统”与“逻辑”和“物理”系统没有区别。在文章中你引用了名为“Actor System”的东西实际上是人们可能称之为“物理角色系统”,即在单个JVM中运行的东西。但是,在一个Actor系统中使用来自Actor上方链接的配置可以将远程Actor创建到另一个物理JVM进程中,即在不同的Actor系统中。这就是“逻辑路径”与“物理路径”的概念成为现实的时候。
希望这有点澄清文档。
答案 2 :(得分:1)
理解逻辑角色路径和物理角色路径之间的区别很重要。
基于角色的分布式系统的性能可能取决于此。
远程部署意味着可以在不同的角色上创建角色 网络主机而不是其父网络主机,即位于不同的参与者系统中。在 在这种情况下,从根监护人开始遵循演员路径 遍历网络,这是一项昂贵的操作。因此,每个 演员也有一条物理路径,从 实际actor对象所在的actor系统。将此路径用作 查询其他参与者时,发件人参考将使他们回复 直接发送给该参与者,从而最大程度地减少了路由选择带来的延迟。 https://getakka.net/articles/concepts/addressing.html
请注意,逻辑路径为角色定义了监督层次结构,而物理路径显示了角色部署的位置。物理角色路径永远不会跨越多个角色系统。