7

Ich verwende Akka in Play Framework anstelle eines Jobs, um den Code so zu programmieren, dass er alle X Sekunden ausgeführt wird. Ich habe eine Art Cluster (läuft auf Heroku, derzeit auf 1 Dyno, aber gelegentlich kann es einige gleichzeitige Instanzen geben).Wie plane ich einen globalen Akka-Job für mehrere Prozesse?

Gibt es eine einfache Möglichkeit, den "Job" global alle N Sekunden im gesamten Cluster auszuführen? Ich weiß, dass Quartz Out-of-Process-Speicher/Sync-Mechanismen unterstützt, z. eine DB - kann ich etwas Ähnliches in Scala verwenden?

Dies ist der Schauspieler-Setup, das auf Play Start ausgeführt wird:

object Global extends GlobalSettings { 

    override def onStart(app: Application) { 
    val monitorActor = Akka.system.actorOf(Props[MonitorLoadJob], name = "monitorLoad") 
    Akka.system.scheduler.schedule(0 seconds, 10 seconds, monitorActor, Tick) 
    } 
} 
+0

vielleicht duplizieren von http://Stackoverflow.com/questions/13765466/periodic-jobs-when-running-multiple-servers/13766458 – Schleichardt

+0

@Schleichardt - nicht ganz. Ich frage speziell nach Akka (im Kontext von Play, aber immer noch eine Akka-Frage) – ripper234

Antwort

9

Auschecken ClusterSingletonManager.

Für einige Anwendungsfälle ist es bequem und manchmal auch zwingend sicherzustellen, dass Sie genau einen Schauspieler eines bestimmten Typs irgendwo im Cluster ausgeführt wird.

Einige Beispiele:

  • einziger Punkt der Verantwortung für bestimmte clusterweite konsistente Entscheidungen oder Koordinierung der Aktionen im gesamten Cluster-System

Es Akka Cluster erfordert läuft, aber es gemacht für diese Art von Szenario.

0

Eine Möglichkeit wäre einen Schauspieler auf jedem Knoten ausgeführt haben, die für eine Benachrichtigungsmeldung wartet, diesen Job zu starten und von der Scheduler senden die Nachricht an diese Akteure.

0

Oder Sie können ein worker Dyno für Ihre Aufträge verwenden, verwenden Sie eine Standard main Methode, um Ihren Job mit Akka zu planen.

Sie können überprüfen, this link (für Java, aber Sie werden die Idee für Scala).

+0

Ich bevorzuge die Lösung, nicht herokuspezifisch zu sein - wir testen gerade die Gewässer mit Herkou und möchten unsere Sperre nicht erhöhen -im. – ripper234

+0

Ah ok. Du musst also ein paar Akka-Ferndarsteller benutzen und einen Weg finden, irgendwo einen Zustand zu speichern. –