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
}
// ...
}
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
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) –
@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 –