Поиск узлов в сети с помощью Акки.

Есть ли способ искать узлы в сети, чтобы, если какой-либо узел был отключен, мы могли бы снова подключить его, когда он станет работающим. В настоящее время я использую mdns, но я хочу добиться этого с помощью akka. Я использую Акку с Java.

1 ответ

Вы можете использовать 2 подхода здесь:

1) Внешний - запустите экземпляр consul.io вместе с кластером. Изучив состояние кластера консула, вы узнаете все машины, подключенные к кластеру, что даст вам представление об общем наборе узлов и их IP-адресах. Сейчас использую JMX в любом месте, чтобы получить статус кластера Akka - вы ищете akka:type=Cluster боб здесь и это свойство Members или же ClusterStatus, Они вернут вам статус кластера - следовательно, вы будете знать набор узлов, доступных в кластере akka. Если вы вычтете набор узлов в кластере Akka из узлов в кластере консулов ​​- вы получите те, которые были удалены / помещены в карантин кворумом кластера Akka, и, скорее всего, они должны быть перезапущены.

2) Внутренний - как только я добавил ThisActorSystemQuarantinedEvent Акке удаленное. Это событие вызывается, когда узел 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 узлов в разных центрах обработки данных со скромным сетевым подключением.

Другие вопросы по тегам