2015-09-03 57 views
6

我在Heroku上運行芹菜工作人員,其中一項任務達到超時限制。當我手動重試它一切正常,所以這可能是一個連接問題。我使用RabbitMQ作爲代理,Celery配置爲對任務進行遲到確認(CELERY_ACKS_LATE = True)。我預計任務將被返回到RabbitMQ隊列並由另一名工作人員再次處理,但這並未發生。您是否需要配置任何其他任務以在工作人員超時時返回到RabbitMQ隊列?芹菜在超時後沒有將任務放回RabbitMQ隊列

下面是日誌:

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

回答

2

看起來你打芹菜時間限制。 http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits

Celery默認不會爲任務實現重試邏輯,因爲它不知道重試對於您的任務是否安全。也就是說,你的任務需要是冪等的,重試纔是安全的。

因此,任務中的任何重試都應在任務中完成。看到這裏的例子:http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.retry

有幾個原因爲什麼你的任務可能超時,但你最好知道。 該任務可能已超時,因爲處理數據所用的時間太長或需要太長時間才能獲取數據。

如果您認爲該任務未能嘗試連接某個服務,我建議減少連接超時間隔並在您的任務中添加重試邏輯。如果您的任務花費的時間太長以至於無法處理數據,請嘗試將數據分塊並按照這種方式進行處理。芹菜對此有很好的支持:http://docs.celeryproject.org/en/latest/userguide/canvas.html#chunks