2015-09-03 28 views
6

私はHeroku上でセロリの作業員を実行していますが、タスクの1つがタイムアウトに達しました。手動で再試行したところ、すべて正常に機能していたため、おそらく接続の問題でした。私はブローカーとしてRabbitMQを使用しており、Celeryはタスク(CELERY_ACKS_LATE = True)の遅れを確認するように設定されています。私はそのタスクがRabbitMQキューに返され、別のワーカーによって再度処理されることを期待していましたが、それは起こりませんでした。作業者がタイムアウトしたときにタスクがRabbitMQキューに戻るために他の設定を行う必要がありますか?ここでCeleryはタイムアウト後に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

セロリは、再試行がタスクにとって安全かどうかわからないため、デフォルトでタスクの再試行ロジックを実装していません。つまり、再試行が安全であるためには、あなたのタスクが偶数である必要があります。

したがって、タスクの失敗による再試行はすべてタスクで行う必要があります。以下の例を参照してください: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

関連する問題