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