2016-07-28 11 views
0

ネットワーク内のノードを検索する方法はありますか。そのため、ノードがダウンした場合、再接続することができます。現在、私はmdnsを使用していますが、私はakkaでこれを達成したいと思います。私はJavaでakkaを使用しています。akkaを使用してネットワーク内のノードを検索します。

1)外部を - クラスタと一緒にconsul.ioのインスタンスを実行します。

+1

私が覚えている限り、ノードはAkkaクラスタのメンバーであれば自動的に再接続する必要があります。 –

+0

これはしばらくの間再接続を試みますが、しばらくして特定の到達不能ノードに対して終了要求が到着します。 –

答えて

1

現在2つのアプローチを使用することができます。 consulクラスタのステータスを読み取ると、クラスタに接続されているすべてのマシンがわかります。これにより、ノードとそのIPアドレスの合計セットがわかります。ここでJMXを使用して、Akkaクラスターのステータスを取得します。ここではakka:type=Cluster beanを探しており、そのプロパティーはMembersまたはClusterStatusです。それらはクラスタの状態を返します。したがって、akkaクラスタで使用可能なノードのセットがわかります。 Akkaクラスタ内のノードの集合をconsulクラスタ内のノードから減算すると、Akkaクラスタクォーラムによって削除/隔離されたものが得られますが、それらは再起動する必要があります。

2)内部 - 一度私はaddedを持っています.Ackaリモーティングには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) 
    } 

    } 

し、それを使用します: - それは全体を再起動しますDefaultClusterWatcher検疫イベントを受け取りますたびその後

val sys = ActorSystem("MyCluster", config) 
ClusterWatcher.registerRestartJVMWatcherActor(sys) 

を、だから、あなたはこのようなものを作成することができますJVM(またはあなたの俳優システムについて何か他のことをしてください)。

これらの方法の組み合わせが最も堅牢であることがわかりました。私の設定では、適度なネットワーク接続を持つ異なるデータセンターで30ノードの自立型分散クラスタを実行できます。

関連する問題