【问题标题】:Does Akka actor incarnation matter for remote calls?Akka 演员的化身对远程调用很重要吗?
【发布时间】:2021-08-24 01:26:41
【问题描述】:

在this page,我读到(强调我的):

你可以创建一个actor,终止它,然后创建一个新的actor 具有相同的演员路径。新创建的演员是新的化身 的演员。这不是同一个演员。演员参考旧 化身对新的化身无效。 消息发送到 即使是旧的演员参考也不会传递给新的化身 尽管它们的路径相同。*

*为了完整起见,发送到“旧”引用的消息将发送到死信邮箱/actor/queue/whatever。

他们进一步声明(强调我的):

当两个actor引用具有相同的路径并指向同一个actor化身时,它们被比较相等。

好的,这很清楚。可以说,actor 引用指向对象的特定实例。

但是在进行远程调用时,实例/“化身”似乎根本不重要。在同一页的下方(强调我的):

当通过网络发送一个actor引用时,它被表示为 通过它的路径。因此,路径必须完全编码所有信息 向底层参与者发送消息所必需的。这是实现的 通过在路径的地址部分编码协议、主机和端口 细绳。当一个actor系统从远程接收到一个actor路径时 节点,它检查该路径的地址是否与 这个演员系统,在这种情况下,它将被解析为演员的 本地参考。

没有关于化身的词 - 或者,各种实例标识符 - 是“必要信息”的一部分。

这有点矛盾,至少令人困惑。让我用一个例子来详细说明。

假设我有一个引用 a 和一个引用 b,它们共享相同的路径。 a 是旧的、死去的“化身”。 b 是新的替代化身。在本地使用a 会将所有消息发送到死信队列。凉爽的。但是,如果我向远程参与者发送一条包含a 作为回复参与者的消息,并且该远程参与者回写一条消息,那么他的消息会自动转到b??

我很难理解这一点,或者更确切地说,是其中的原因。为什么有区别。我的意思是如果这是真的 - 有区别 - 那么我可以编写一些非常有趣的测试代码,我无法与一个被取代/死去的人 a 但如果我把死去的人 a 放在电线上其他任何人,他们都可以愉快地与他交流,没有问题,哈哈。显然我必须遗漏一些东西!

【问题讨论】:

    标签: akka actor


    【解决方案1】:

    一个已经崩溃并被监督重新启动的演员,不是一个新的“化身”,但会回答相同的ActorRef(s)。尽管它实际上是一个新实例化的对象,但它是相同的参与者,从一张干净的表开始,以避免处理由于崩溃而导致的任何内部状态损坏。其他演员可以继续与它互动,就好像什么都没发生一样。

    一个停止的actor,然后父级启动一个新的(可能完全不同的actor,使用不同的协议)但使用相同的名称,因此路径,是一个新的化身,现有的actor引用之前的“化身”确实不要指向这个新演员。

    监督重启(和恢复)也不会触发死亡守望,而停止演员会。

    这对于远程和本地ActorRefs 都是一样的。

    使用类型化集群,获取远程参与者的唯一方法是从接待员或您已经引用的远程参与者那里获取带有 ActorRef 的消息。

    通过 Akka Classic API 中的远程处理,您可以使用较低级别的 actorSelection,这仅与路径有关,然后接受您对“化身”一无所知,或者是否曾经有演员在当你向它发送消息时的那个路径(如果不是消息变成死信),或者你解决它并获得一个ActorRef 用于那个时间点的选择,那么它将不再指向一个演员,如果演员停止(并且消息变成死字)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多