2015-05-27 7 views
26

Wir haben eine verteilte Architektur basierend auf rabbitMQ und Celery. Wir können mehrere Aufgaben ohne Probleme parallel starten. Die Skalierbarkeit ist gut.Interagieren mit Sellerie laufenden Aufgabe

Jetzt müssen wir die Aufgabe remote steuern: PAUSE, RESUME, CANCEL. Die einzige Lösung, die wir gefunden haben, besteht darin, in der Sellerie-Task einen RPC-Aufruf an eine andere Task zu machen, die den Befehl nach einer DB-Anforderung beantwortet. Der Sellerie-Task und der RPC-Task befinden sich nicht auf demselben Computer und nur der RPC-Task hat Zugriff auf den DB.

Haben Sie einen Rat, wie Sie es verbessern und problemlos mit einer laufenden Aufgabe kommunizieren können? Danke

EDIT: In der Tat würden wir so etwas wie im Bild unten tun. Es ist einfach, die Blue Konfiguration oder die Orange zu tun, aber wir wissen nicht, wie man beides gleichzeitig tut. enter image description here Arbeiter abonnieren eine gemeinsame Jobs queue und jeder Arbeiter hat seine eigene Admin queue an einer Börse deklariert.

EDIT: Ist dies nicht möglich, mit Celery, I'am offen für eine Lösung mit anderen Frameworks wie python-rq.

Antwort

5

Es sieht aus wie die Control Bus pattern.

Für eine bessere Skalierbarkeit und um den RPC-Aufruf zu reduzieren, empfehle ich, die Logik umzukehren. Der Befehl PAUSE, RESUME, CANCEL wird über einen Steuerbus an die Sellerie-Tasks gesendet, wenn die Statusänderung eintritt. Die Sellerie-App speichert den aktuellen Stand der Sellery-App in einem Geschäft (könnte sich im Speicher befinden, auf dem Dateisystem ...). Wenn Task-Zustände auch nach einem Stopp/Start der App beibehalten werden müssen, wird es mehr Arbeit erfordern, um beide Apps synchronisiert zu halten (zB Synchronisation beim Start).

+0

Vielen Dank, aber gibt es eine Möglichkeit, den Management-Kanal mit Sellerie zu implementieren? – Julio