2012-03-28 11 views
11

Wie verhindert man, dass Sellery eine periodische Task ausführt, bevor die vorherige Ausführung abgeschlossen wurde?So stellen Sie sicher, dass eine Sellerie-Aufgabe überlappende Sellerie-Taskausführungen verhindert

Ich habe einen Cluster von Servern, die mit einem gemeinsamen Datenbankserver verbunden sind und Sellerie-Aufgaben ausführen, und ich stelle fest, dass jeder Server gelegentlich die gleiche Aufgabe gleichzeitig ausführen kann, sowie verschiedene Server, die dieselbe Aufgabe gleichzeitig ausführen. Dies verursacht eine Vielzahl von Wettlaufbedingungen, die meine Daten auf schmerzhaft subtile Weise verfälschen.

Ich habe durch Celery's docs gelesen, aber ich kann keine Option finden, die dies ausdrücklich erlaubt. Ich fand eine similar question, aber die vorgeschlagene Lösung scheint wie ein Hack, da es auf Caching-Framework von Django beruht, und daher möglicherweise nicht von allen Servern in einem Cluster geteilt wird, so dass mehrere Server immer noch die gleiche Aufgabe zur gleichen Zeit ausführen.

Gibt es eine Option in Sellery, um aufzuzeichnen, welche Aufgaben derzeit in der Datenbank ausgeführt werden, und nicht erneut auszuführen, bis der Datenbankeintrag gelöscht wird?

Ich bin mit dem Django-Sellerie-Modul, und obwohl es bietet Seiten/admin/djcelery/Taskstate/und/admin/djcelery/workerstate /, Ich habe nie keine gesehen langen Lauf Aufgaben oder Arbeiter dort auftauchen.

Antwort

2

Wenn ich Sie wäre, würde ich eine spezielle Warteschlange für alle Jobs einrichten, die nicht gleichzeitig ausgeführt werden können. Dann können Sie einfach einen separaten Worker nur für diese Warteschlange starten.

3

Standard Weg ist die gemeinsame Sperre über Django Standard-Cache-Mechanismus zu verwenden. Siehe this recipe aus der offiziellen Dokumentation

+0

Und wie ich schon erwähnte, das ist kein robuster Mechanismus in einer Cluster-Einstellung ... Warum gibt es keine Option, die die Datenbank verwendet? – Cerin

+0

Verwenden Sie memcached Backend und Sie erhalten Cluster-Funktionalität –

+1

@AlexLebedev, das ist ein guter Punkt, aber * wenn und nur wenn * die Maschinen im Cluster das Back-End teilen. Zum Beispiel ist es nicht undenkbar, memcached lokal auszuführen und ein localhost-memcached-Backend für jede Box zu verwenden. Logisch offensichtlich, aber ich wollte nur darauf hinweisen, dass niemand denkt "Oh, ich benutze memcached, Problem gelöst." – mrooney

Verwandte Themen