2013-03-06 11 views
5

Ich möchte ein verteiltes Job Execution System mit Sellerie implementieren. Da rabbitMQ keine Prioritäten unterstützt und ich diese Funktion schmerzlich brauche, wandte ich mich an Sellerie + Redis.Aufgabe Priorität in Sellerie mit Redis

In meiner Situation sind die Aufgaben eng mit Hardware verbunden, zum Beispiel, Aufgabe A konnte nur auf Arbeiter 1 laufen, da nur der PC von Arbeiter 1 die notwendige Hardware hat. Ich setze den CONCURRENCY jedes Arbeiters auf 1, so dass ein Arbeiter jedes Mal nur eine Aufgabe ausführt. Jede Aufgabe dauert etwa 2 Minuten.

Um die Priorität-Funktion, vor allem implementiere ich priority Argument versucht, das Hinzufügen, wenn apply_async() Aufruf, zum Beispiel apply_async(priority=0) und apply_async(priority=9). In diesem Test startete ich nur einen Worker mit COCURRENCY = 1 und startete 10 Aufgaben nacheinander mit unterschiedlichen Prioritäten. Ich habe erwartet, dass die Aufgaben, die von apply_async(priority=0) gestartet werden, vorrangig ausgeführt werden, aber unglücklicherweise werden sie gerade als Kick-Off-Order gestartet.

Dann versuche ich etwas Arbeit zu tun. Ich habe jede Aufgabe geklont, also habe ich task_high und task_low für jeden von @celery.task(priority=0) und @celery.task(priority=1). Dann habe ich den gleichen Test wie oben durchgeführt, diesmal war es besser, wenn die Anstoßreihenfolge "HH-LLLL-HHHH" ist, lautet die reale Reihenfolge "HH-L-H-H-L-H-L-L-H". Ich nehme an, dass redis hier einige planerische und ausgleichende Arbeit geleistet hat.

Aber das kann immer noch nicht meine Erwartungen erfüllen. Ich hoffe, eine Bestellung wie "HHHHHH-LLLL" bekommen zu können, denn für einige Aufgaben habe ich nur eine richtige Maschine mit der nötigen Hardware und hoffe die hochpriorisierte Aufgabe so schnell wie möglich zu erledigen.

Ich habe nach anderen Arbeiten im Internet gesucht, zum Beispiel mit zwei Warteschlangen, eine für Aufgaben mit hoher Priorität und die andere für niedrige Priorität und die Verwendung von 2 Maschinen für die ehemalige und 1 Maschine für die letztere. Aber da meine Hardware ziemlich begrenzt ist, funktioniert das nicht für mich.

Könnten Sie bitte einige Vorschläge machen?

Antwort

13

Der Transport von Sellerie Redis berücksichtigt das Prioritätsfeld , aber Redis hat selbst keine Prioritäten.

Die Prioritätsunterstützung wird implementiert, indem n Listen für jede Warteschlange erstellt und diese Reihenfolge im BRPOP-Befehl verwendet wird. Ich sage n hier, denn obwohl es 10 (0-9) Prioritätsstufen gibt, sind diese standardmäßig in 4 Ebenen konsolidiert, um Ressourcen zu sparen. Dies bedeutet, dass eine Warteschlange mit dem Namen celery wirklich in 4 Warteschlangen aufgeteilt werden:

['celery0', 'celery3`, `celery6`, `celery9`] 

Wenn Sie mehr Priorität wollen Ebenen Sie die priority_steps Transport Option einstellen:

BROKER_TRANSPORT_OPTIONS = { 
    'priority_steps': list(range(10)), 
} 

Das heißt, dass dieses wird niemals so gut sein wie die implementierten Prioritäten auf der Server-Ebene, und kann bestenfalls ungefähr sein. Aber es kann immer noch gut sein genug für Ihre Anwendung.

+0

Danke für die Details, aber was kann ich tun, um eine Bestellung zu bekommen, wie ich will? Sollte ich nur die 'priority_steps' ändern? –

+0

Sie werden es einfach ausprobieren. Mit den Standard-Prioritätsschritten werden diese 0 und 1 nur auf 0 konsolidiert. – asksol

+0

OK Danke, ich habe versucht mit Priorität 0 für Aufgabe hoch und Priorität 9 für Aufgabe niedrig, jetzt scheint es viel besser, obwohl manchmal einige Aufgaben mit Priorität 9 noch vor denen mit Priorität 0 laufen. Ich weiß nicht, ob da was ist falsch mit meinen Konfigurationen oder es ist Redis, die einige Balancing-Arbeit getan hat. –

Verwandte Themen