【发布时间】: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 放在电线上其他任何人,他们都可以愉快地与他交流,没有问题,哈哈。显然我必须遗漏一些东西!
【问题讨论】: