如何正确重启 actor 系统并将其重新加入刚刚离开的 akka 集群?
How to correctly restart a actor system and rejoin it to akka cluster which just left from?
“重启 actor 系统”对 akka 集群意味着什么?
假设我有一个种子节点 A 和另一个节点 B,执行这些代码:
let clusterObjOnNodeB = Cluster.Get actorSystemB
clusterObjOnNodeB.JoinSeedNodes
<| ImmutableList.Create<Address>(seq[
Address.Parse @"path to node A"
]|>Seq.toArray)
clusterObjOnNodeB.Leave clusterObjOnNodeB.SelfAddress
如何在不处理 actorSystemB 的情况下重新启动 actorSystemB 并重新加入集群?
您可以优雅地创建一个演员系统 leave its current cluster and rejoin it again (keep in mind that this is an async operation and won't happen immediately, so if you want to wait for it you can hook up to removed 事件)。
然而,这并不等同于重新启动 actor 系统,这通常意味着 terminating 并重新启动它。这样做的原因是通常有很多内部状态由 actor 系统本身保存,不会简单地将自身重置为某个初始值。有时,各个参与者的状态可能会纠缠在一起,形成一种形式,从而导致问题的发生。在这种情况下,重新启动一个 - 可能不相关的 - 系统将无济于事。
“重启 actor 系统”对 akka 集群意味着什么? 假设我有一个种子节点 A 和另一个节点 B,执行这些代码:
let clusterObjOnNodeB = Cluster.Get actorSystemB
clusterObjOnNodeB.JoinSeedNodes
<| ImmutableList.Create<Address>(seq[
Address.Parse @"path to node A"
]|>Seq.toArray)
clusterObjOnNodeB.Leave clusterObjOnNodeB.SelfAddress
如何在不处理 actorSystemB 的情况下重新启动 actorSystemB 并重新加入集群?
您可以优雅地创建一个演员系统 leave its current cluster and rejoin it again (keep in mind that this is an async operation and won't happen immediately, so if you want to wait for it you can hook up to removed 事件)。
然而,这并不等同于重新启动 actor 系统,这通常意味着 terminating 并重新启动它。这样做的原因是通常有很多内部状态由 actor 系统本身保存,不会简单地将自身重置为某个初始值。有时,各个参与者的状态可能会纠缠在一起,形成一种形式,从而导致问题的发生。在这种情况下,重新启动一个 - 可能不相关的 - 系统将无济于事。