有没有办法搜索网络中的节点,这样如果任何节点关闭,我们可以在它出现时再次重新连接它。目前我正在使用mdns,但我想用akka实现这一点。我正在使用java的akka。
答案 0 :(得分:1)
您可以在这里使用两种方法:
1)外部 - 与群集一起运行consul.io的实例。通过阅读 consul 群集的状态,您将了解连接到群集的所有计算机 - 这将使您了解节点的总集合及其IP地址。现在在任何地方使用JMX
来检索Akka群集的状态 - 您在此处查找akka:type=Cluster
bean及其属性Members
或ClusterStatus
。这些将返回群集状态 - 因此您将知道 akka 群集中可用的节点集。如果从 consul 群集中的节点中减去 Akka 群集中的节点集 - 您将获得由Akka群集仲裁删除/隔离的节点,并且大多数可能那些必须重新启动。
2)内部 - 一旦我added ThisActorSystemQuarantinedEvent
到Akka远程。当节点从群集removed
开始,然后被隔离时,会触发此事件 - 因此它无法自动重新连接到群集。所以你可以创建这样的东西:
object ClusterWatcher {
private class DefaultClusterWatcher extends Actor with ClusterWatcher {
override def receive = handleQuarantinedRestart
}
def registerRestartJVMWatcherActor(sys: ActorSystem) = {
val ref = sys.actorOf(Props[DefaultClusterWatcher])
sys.eventStream.subscribe(ref, classOf[ThisActorSystemQuarantinedEvent])
}
}
trait ClusterWatcher {
_: Actor ⇒
def handleQuarantinedRestart: Actor.Receive = {
case err: ThisActorSystemQuarantinedEvent ⇒
import SlackNotification._
slackEmergency(s"Actor system ${err.localAddress} is quarantined by ${err.remoteAddress}, restarting")
sys.exit(1)
}
}
在你创建了演员系统之后使用它:
val sys = ActorSystem("MyCluster", config)
ClusterWatcher.registerRestartJVMWatcherActor(sys)
然后,只要DefaultClusterWatcher
将收到隔离事件 - 它将重新启动整个JVM(或者对演员系统执行其他操作 - 由您决定)。
我发现这些方法的组合最强大 - 在我的设置中,它允许我在具有适度网络连接的不同数据中心中运行30个节点的自持分布式群集。