使用akka搜索网络中的节点。

时间:2016-07-28 12:30:31

标签: java akka akka-cluster

有没有办法搜索网络中的节点,这样如果任何节点关闭,我们可以在它出现时再次重新连接它。目前我正在使用mdns,但我想用akka实现这一点。我正在使用java的akka​​。

1 个答案:

答案 0 :(得分:1)

您可以在这里使用两种方法:

1)外部 - 与群集一起运行consul.io的实例。通过阅读 consul 群集的状态,您将了解连接到群集的所有计算机 - 这将使您了解节点的总集合及其IP地址。现在在任何地方使用JMX来检索Akka群集的状态 - 您在此处查找akka:type=Cluster bean及其属性MembersClusterStatus。这些将返回群集状态 - 因此您将知道 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个节点的自持分布式群集。