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