2015-09-03 15 views
6

Pracuję z pracownikami Seler na Heroku i jedno z zadań przekroczyło limit czasu. Po ponownym sprawdzeniu go ręcznie wszystko działało dobrze, więc prawdopodobnie był to problem z połączeniem. Używam RabbitMQ jako brokera, a Seler jest skonfigurowany do wykonywania późnego potwierdzenia zadań (CELERY_ACKS_LATE = True). Spodziewałem się, że zadanie zostanie zwrócone do kolejki RabbitMQ i ponownie przetworzone przez innego pracownika, ale tak się nie stało. Czy muszę skonfigurować cokolwiek innego, aby zadanie powróciło do kolejki RabbitMQ po przekroczeniu limitu czasu przez pracownika?Seler nie postawił zadania w kolejce RabbitMQ po przekroczeniu limitu czasu

Oto kłody:

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)' 

Odpowiedz

2

Wygląda na to, że uderzenie terminów selera. http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits

Firma Seler nie implementuje logiki ponawiania zadań domyślnie, ponieważ nie wie, czy ponowne próby są bezpieczne dla zadań. Mianowicie, twoje zadanie musi być idempotentne, aby próby były bezpieczne.

W ten sposób w zadaniu należy wykonać wszystkie ponowienia z powodu błędów zadań. Zobacz przykład tutaj: http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.retry

Istnieje kilka powodów, dla których Twoje zadanie mogło przekroczyć limit czasu, ale wiesz najlepiej. Zadanie mogło przekroczyć limit czasu, ponieważ przetwarzanie danych trwało zbyt długo lub zbyt długo trwało pobieranie danych.

Jeśli uważasz, że zadanie nie próbuje połączyć się z jakąś usługą, sugeruję zmniejszenie interwału limitu czasu połączenia i dodanie do zadania logiki ponownej próby. Jeśli przetwarzanie danych zajmuje zbyt dużo czasu, spróbuj podzielić dane w porcje i przetworzyć je w ten sposób. Seler ma dobre wsparcie: http://docs.celeryproject.org/en/latest/userguide/canvas.html#chunks