2017-03-21 6 views
0

ich zu implementieren versuchen Szenario für Akka Clusterstart:Was ist der richtige Weg für Akka Cluster Singleton Start

  1. Run Cluster Samen mit einfachen Schauspieler einige
  2. Run (Cluster-Monitor, der schließt sich von anderen Mitgliedern zeigt) Cluster-Mitglied, das für Singleton Implementierung ClusterSingletonManager und ClusterSingletonProxy Schauspieler verwendet

Aber ich habe ein Problem:

10:52:41.691UTC INFO akka.tcp://[email protected]:9401/user/singletonOfEvents - ClusterSingletonManager state change [Start -> Younger] 

und mein Singleton wurde nicht gestartet.

Ich sah "Der Singleton-Schauspieler läuft immer auf dem ältesten Mitglied mit der angegebenen Rolle." in Akka Cluster Singleton doc. Aber ich kann nicht verstehen, wie Singleton gestartet werden muss. Vielleicht müssen alle Singletons im ersten Seed-Knoten implementiert und gestartet werden?

+1

Wie kann man wissen, dass der Schauspieler Singletons ist nicht gestartet? Vielleicht müssen Sie "preStart" implementieren und einige Protokolle hinzufügen, um zu wissen, ob es passiert oder nicht. – hveiga

+0

Das von akka bereitgestellte Singleton muss nicht explizit gestartet werden. Die Akka-Implementierung überwacht den Clusterstatus selbst und startet Singleton auf dem ältesten Knoten, für den eine Rolle für Singleton angegeben wurde. Von der Log-Nachricht, die Sie zur Verfügung gestellt haben, scheint Singleton tatsächlich gestartet zu sein. Um Clusterstatus zu überwachen und zu protokollieren, müssen Sie etwas wie [this] (http://doc.akka.io/docs/akka/2.4.17/scala/cluster-usage.html#A_Simple_Cluster_Example) –

+0

@andrey implementieren. feoktistov Ich kann nicht verstehen, wie der Akteur auf dem Knoten gestartet werden kann, wo keine Abhängigkeiten und Eigenschaften benötigt werden. Auf dem ersten Knoten (Seed) habe ich einfache Mitglieder Monitor (wie in bestimmten Link) und andere Knoten mit Singleton-Implementierung Ich benutze Akka-Persistenz und Datenbanken in Singleton-Schauspieler –

Antwort

1

Wie in der Akka-Dokumentation beschrieben, wird die Cluster Singleton-Actor-Instanz vom ClusterSingletonManager-Actor auf jedem der Cluster-Knoten mit der angegebenen Rolle für den Singleton gestartet und verwaltet. ClusterSingletonManager verwaltet höchstens eine Singleton-Instanz auf dem ältesten Knoten des Clusters mit der angegebenen Rolle zu einem beliebigen Zeitpunkt. Sollte der älteste Knoten (der erste Seed-Knoten) ausfallen, wird der nächstälteste Knoten gewählt. Verwenden Sie ClusterSingletonProxy, das auf allen Knoten mit der angegebenen Rolle vorhanden ist, um auf den Cluster-Singleton-Akteur zuzugreifen.

Hier ist, was eine Beispielanwendung, die das Cluster startet Singleton aussehen könnte:

object Main { 

    def workTimeout = 10.seconds 

    def main(args: Array[String]): Unit = { 
    // Validate arguments host and port from args(0) and args(1) 
    // ... 

    val role = "worker" 

    val conf = ConfigFactory.parseString(s"akka.cluster.roles=[$role]"). 
     withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.hostname=" + host)). 
     withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.port=" + port)). 
     withFallback(ConfigFactory.load()) 

    val system = ActorSystem("ClusterSystem", conf) 

    system.actorOf(
     ClusterSingletonManager.props(
     Master.props(workTimeout), 
     PoisonPill, 
     ClusterSingletonManagerSettings(system).withRole(role) 
    ), 
     name = "master" 
    ) 

    val singletonAgent = system.actorOf(
     ClusterSingletonProxy.props(
     singletonManagerPath = "/user/master", 
     settings = ClusterSingletonProxySettings(system).withRole(role) 
    ), 
     name = "proxy" 
    ) 

    // ... 
    } 

    // ... 
} 

object Master { 
    def props(workTimeout: FiniteDuration): Props = 
    Props(classOf[Master], workTimeout) 

    // ... 
} 

class Master(workTimeout: FiniteDuration) extends Actor { 
    import Master._ 

    // ... 
} 

Die Cluster-Konfigurationen wie die aussehen könnte folgende:

akka { 

    actor.provider = "akka.cluster.ClusterActorRefProvider" 

    remote.netty.tcp.port = 0 
    remote.netty.tcp.hostname = 127.0.0.1 

    cluster { 
    seed-nodes = [ 
     "akka.tcp://[email protected]:2552", 
     "akka.tcp://[email protected]:2552" 
    ] 

    auto-down-unreachable-after = 10s 
    } 

    // ... 
} 
Verwandte Themen