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

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


person Amit Yadav    schedule 28.07.2016    source источник
comment
Насколько я помню, узел должен автоматически переподключаться, если он является членом кластера Akka.   -  person Branislav Lazic    schedule 28.07.2016
comment
Некоторое время он пытается переподключиться, но через некоторое время приходит запрос на завершение для конкретного недостижимого узла.   -  person Amit Yadav    schedule 28.07.2016


Ответы (1)


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

1) Внешний — запустите экземпляр consul.io вместе с кластером. Прочитав статус кластера consul, вы узнаете все машины, подключенные к кластеру, что даст вам некоторое представление об общем наборе узлов и их IP-адресах. Теперь используйте JMX где угодно, чтобы получить статус кластера Akka — здесь вы ищете akka:type=Cluster bean-компонент и его свойство Members или ClusterStatus. Они вернут вам статус кластера, поэтому вы будете знать набор узлов, доступных в кластере akka. Если вычесть набор узлов в кластере Akka из узлов в кластере consul, вы получите те, которые были удалены/помещены в карантин кворумом кластера 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 узлов в разных центрах обработки данных со скромным сетевым подключением.

person jdevelop    schedule 20.09.2016