2015-09-03 9 views
6

Ich führe Sellerie Arbeiter auf Heroku und eine der Aufgaben traf eine Auszeit begrenzen. Als ich es manuell versuchte, funktionierte alles gut, also war es wahrscheinlich ein Verbindungsproblem. Ich benutze RabbitMQ als Broker und Sellery ist so konfiguriert, dass die Aufgaben später quittiert werden (CELERY_ACKS_LATE = True). Ich erwartete, dass die Aufgabe an die RabbitMQ-Warteschlange zurückgegeben und von einem anderen Mitarbeiter erneut verarbeitet wurde, aber es ist nicht passiert. Muss ich noch etwas anderes konfigurieren, damit eine Aufgabe in die RabbitMQ-Warteschlange zurückkehrt, wenn das Zeitlimit überschritten wird?Sellerie hat keine Aufgabe in RabbitMQ Warteschlange nach Timeout

Hier sind Protokolle:

Traceback (most recent call last): 
    File "/app/.heroku/python/lib/python3.4/site-packages/billiard/pool.py", line 639, in on_hard_timeout 
    raise TimeLimitExceeded(job._timeout) 
billiard.exceptions.TimeLimitExceeded: TimeLimitExceeded(60,) 
[2015-09-02 06:22:14,504: ERROR/MainProcess] Hard time limit (60s) exceeded for simulator.tasks.run_simulations[4e269d24-87a5-4038-b5b5-bc4252c17cbb] 
[2015-09-02 06:22:18,877: INFO/MainProcess] missed heartbeat from [email protected] 
[2015-09-02 06:22:18,922: ERROR/MainProcess] Process 'Worker-1' pid:9 exited with 'signal 9 (SIGKILL)' 

Antwort

2

Sieht aus wie Sie Sellerie Fristen treffen sind. http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits

Sellery implementiert keine Wiederholungslogik für Aufgaben standardmäßig, da es nicht weiß, ob Wiederholungen für Ihre Aufgaben sicher sind. Ihre Aufgabe muss nämlich idempotent sein, damit Wiederholungen sicher sind.

Daher sollten alle Wiederholungen aufgrund von Taskfehlern in der Task durchgeführt werden. Sehen Sie das Beispiel hier: http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.retry

Es gibt ein paar Gründe, warum Ihre Aufgabe abgelaufen sein könnte, aber Sie würden es am besten wissen. Die Task konnte abgelaufen sein, weil die Datenverarbeitung zu lange dauerte oder das Abrufen zu lange dauerte.

Wenn Sie der Meinung sind, dass die Aufgabe nicht versucht, eine Verbindung zu einem Dienst herzustellen, empfehle ich, das Zeitlimitintervall für Verbindungen zu verringern und Wiederholungslogik in Ihrer Aufgabe hinzuzufügen. Wenn Ihre Aufgabe zu lange dauert, um Daten zu verarbeiten, versuchen Sie, Ihre Daten in Blöcken aufzuteilen und auf diese Weise zu verarbeiten. Sellerie hat dafür eine gute Unterstützung: http://docs.celeryproject.org/en/latest/userguide/canvas.html#chunks

Verwandte Themen