Ich suche nach einem verteilten Cron-ähnlichen Framework für Python und finde Sellerie. Die Dokumentation sagt jedoch "Sie müssen sicherstellen, dass nur ein einzelner Scheduler für einen Zeitplan gleichzeitig ausgeführt wird, sonst würden Sie mit doppelten Aufgaben enden", Sellery verwendet sellery.beat.PersistentScheduler, die den Zeitplan in einer lokalen Datei speichern.
Also, meine Frage, gibt es eine andere Implementierung als die Vorgabe, die den Zeitplan "in den Cluster" setzen und die Ausführung der Aufgaben so koordinieren kann, dass jede Aufgabe nur einmal ausgeführt wird? Mein Ziel ist es, Selleriebeat mit identischen Zeitplänen auf allen Hosts im Cluster ausführen zu können.
Danke
tl; dr : Kein Celerybeat ist für Ihren Anwendungsfall nicht geeignet. Sie müssen nur einen Prozess von celerybeat
ausführen, sonst werden Ihre Aufgaben dupliziert.
Ich weiß, das ist eine sehr alte Frage. Ich werde versuchen, eine kleine Zusammenfassung zu machen, weil ich das gleiche Problem / die gleiche Frage habe (im Jahr 2018).
Etwas Hintergrund: Wir betreiben Django-Anwendung (mit Sellerie) im Kubernetes-Cluster. Cluster (EC2-Instanzen) und Hülsen (~ Container) automatisch skaliert werden: einfach gesagt, ich weiß nicht, wann und wie viele Instanzen der Anwendung ausgeführt werden.
Es liegt in Ihrer Verantwortung, nur einen Prozess von celerybeat
auszuführen, anderenfalls werden Ihre Aufgaben dupliziert. [1] Diese Feature-Anforderung wurde im Sellery-Repository gespeichert: [2]
Der Benutzer muss sicherstellen, dass nur eine Instanz von Selleriebeat existiert in ihrem Cluster eine wesentliche Implementierung Last (entweder einen einzelnen Fehlerpunkt erzeugen oder Benutzer ermutigen) ihren eigenen verteilten Mutex zu rollen).
Selleriebeat sollte entweder einen Mechanismus zur Verfügung stellen, um versehentlich zu verhindern Nebenläufigkeit, oder die Dokumentation sollte eine Best-Practice vorschlagen nähern.
Nach einiger Zeit wurde diese Feature-Anfrage vom Autor von Sellery aus Mangel an Ressourcen abgelehnt. [3] Ich empfehle dringend, den gesamten Thread auf dem Github zu lesen. Leute dort empfehlen diese Projekte / Lösungen:
Ich habe nichts von dem oben Gesagten versucht (ich möchte keine andere Abhängigkeit in meiner App und ich mag es nicht, Aufgaben zu sperren / Sie müssen sich mit Fail-Over etc. befassen ./).
Ich habe CronJob in Kubernetes verwendet ( Ссылка ).
[1] sellerybeat - mehrere Instanzen & amp; Überwachung
[2] Ссылка
[3] Ссылка
Ich denke, es könnte ein Missverständnis darüber geben, was Selleriebeat macht. Selleriebeat verarbeitet die periodischen Aufgaben nicht; es veröffentlicht sie nur. Es legt die periodischen Aufgaben in der Warteschlange an, die von den sellerisierten Arbeitern verarbeitet werden sollen. Wenn Sie einen einzelnen Sellerybeat-Prozess und mehrere Selleryd-Prozesse ausführen, wird die Task-Ausführung in den Cluster verteilt.
Wir hatten das gleiche Problem, bei dem wir drei Server hatten, auf denen Celerybeat lief. Allerdings bestand unsere Lösung darin, nur Celerybeat auf einem einzelnen Server auszuführen, sodass keine doppelten Aufgaben erstellt wurden. Warum möchten Sie, dass Celerybeat auf mehreren Servern läuft?
Wenn Sie besorgt sind, dass Sellerie ausfällt, erstellen Sie einfach ein Skript, um zu überwachen, dass der Celerybeat-Prozess noch läuft.
%Vor%Das zeigt Ihnen, ob der Celerybeat-Prozess läuft. Erstellen Sie dann ein Skript, in dem Sie den Systemadministrator per E-Mail benachrichtigen, wenn der Prozess nicht verfügbar ist. Hier ist ein Beispiel-Setup , wo wir nur Celerybeat laufen auf einem Server.