我在使用 akka 集群时遇到问题。
系统设置:2 个节点,每个节点有 2 个工作 Actor 实例。所有这些参与者(总共 4 个)都由应用程序中的单个参与者进行跟踪。
问题是,当其中一个节点缩小时,单例 Actor 仍然保留对已关闭节点中的 Actor 的引用。
我无法找出原因。
我不确定 akka 集群中的哪个部分负责处理此类场景,以及在哪里查找问题。
这是预期的行为。仅仅因为一个 actor 消失(因为它被停止,它失败,它的节点,它的节点消失,其他)并不意味着
ActorRef
被删除或类似的事情。对于ActorRef
的工作方式来说,这实际上是不可能的:它们只是可以传递/复制/等等的普通对象。
您有几个选择:
当 Actor 通过 watch
或
watchWith
终止时,Actor 可以注册接收消息。 (作为演员,您可以收到消息,这与
ActorRef
等普通对象不同。)
您可以以类似的方式监听集群成员的变化。
您可以使用内置的
Receptionist
来自动执行此类操作,而不是构建自己的单例来跟踪演员。
从根本上讲,在您所描述的系统中,消息发送者确实需要具有弹性。例如,如果这些工作参与者之一最终位于网络分区后面,它将无法响应或注销自身。除了上述之外,还必须有某种备份计划。