2016-05-03 11 views
0

Ich habe mehrere Server, die zu bestimmten Zeiten geplante Jobs ausführen müssen.Sicherstellen, dass ein einzelner Server eine Task ausführt

Die Jobs sind in einer Datenbank definiert, mit der jeder Server kommuniziert. Ich muss sicherstellen, dass ein Job von NUR einem Server ausgeführt wird.

So dieses Szenario vorstellen:

  1. Ein Job einige Zeit T in Zukunft geplant ist.

  2. Bei T, beide Server aufwachen und führen Sie die folgende Abfrage: update messages set claimedBy = <server_id> where claimedBy = null and timeToRun = <the scheduled time> limit 10

  3. Jeder Server führt seine Arbeit und am Ende setzt die processed Spalte true, so dass wir wissen, dass es tatsächlich verarbeitet wurde (Diese wird helfen, wenn ein Server abstürzt etc.).

Wie klingt dieses Schema? Siehst du irgendwas falsch damit?


Oder vielleicht ist es eine bessere Idee, einen Server zu haben, die andere „koordiniert“ durch die Jobs sie vorbei, so dass das Problem existiert nicht?

Antwort

1

Solange Ihre Logik zum Suchen und Aktualisieren der Datensätze in einer Transaktion stattfindet, klingt das okay, d. H. Es wird kein in Konflikt stehendes Update von mehr als einem Server stattfinden.

Die Lösung mit einem koordinierenden Server hat eine Pro und eine Con. Pro: Sie können eine Intracate-Logik implementieren, um zu entscheiden, welcher Server welche Jobs erhalten soll, falls erforderlich. Con: Sie sind von diesem einen Server abhängig. Die erste Lösung funktioniert auch, wenn einige Server nicht verfügbar sind, solange mindestens einer von ihnen aktiv ist.

Verwandte Themen