私たちは ジャンゴ1.3 アプリケーションと django-celery 2.5.5 これは1か月間本番環境で正常に実行されていましたが、セロリのタスクの突然の1つはすべて現在実行に失敗しています。
RabbitMQブローカーとCeleryワーカーは別のマシンで実行されており、celeryconfig.pyはその特定のRabbitMQインスタンスをバックエンドとして使用するように構成されています。
アプリケーションサーバーで、セロリタスクを手動で起動しようとしました python manage.py shell
.
実際のタスクは次のように呼び出されます。
>>> result = tasks.runCodeGeneration.delay(code_generation, None)
>>> result
<AsyncResult: 853daa7b-8be5-4a25-a1d0-1552b38a0d21>
>>> result.state
"PENDING"
を返します AsyncResult
予想どおりですが、そのステータスは永遠です "PENDING"
.
RabbitMQブローカーがメッセージを受信したかどうかを確認するために、次を実行しました。
$ rabbitmqctl list_queues name messages messages_ready messages_unacknowledged | grep 853daa
853daa7b8be54a25a1d01552b38a0d21 0 0 0
私はこれが何を意味するのかわからない、RabbitMQは確かに何らかの種類の要求を受信しているようです。それ以外の場合は、idが853daa7b8be54a25a1d01552b38a0d21のタスクに対してキューを作成できます。メッセージを保持していないようです。
CeleryとRabbitMQの両方を再起動しようとしましたが、問題は解決しません。
セロリは次のように実行されます。 $ python /home/[project]/console/manage.py celeryd -B -c2 --loglevel=INFO
celerybeat /スケジュールされたタスクは正常に実行されているように見えることに注意してください。
[編集]: init.dスクリプトによってインライン化されるため、RabbitMQ構成はありません。
/usr/lib/erlang/erts-5.8.5/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -noshell -noinput -sname rabbit@hostname -boot /var/lib/rabbitmq/mnesia/rabbit@hostname-plugins-expand/rabbit -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/rabbit@hostname.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@hostname-sasl.log"} -os_mon start_cpu_sup true -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@hostname"
[編集2]: これがワーカーに使用しているceleryconfigです。プロデューサーにも同じ設定が使用されますが、ローカルホストは、RabbitMQブローカーのあるボックスに変更されます。
from datetime import timedelta
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "console"
BROKER_PASSWORD = "console"
BROKER_VHOST = "console"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
CELERYD_HIJACK_ROOT_LOGGER = True
CELERYD_LOG_FORMAT = "[%(asctime)s: %(levelname)s/%(processName)s/%(name)s] %(message)s"
CELERYBEAT_SCHEDULE = {
"runs-every-60-seconds": {
"task": "tasks.runMapReduceQueries",
"schedule": timedelta(seconds=60),
"args": ()
},
}
[編集3]: 私たちのインフラストラクチャは、以下の番号2のように設定されています。
回答:
回答№1は2問題を解決しました。
60秒ごとに実行するようにスケジュールされていた、長時間実行されるcelerybeatタスク(〜430秒)がありました。これは、キュー内のすべてのワーカーを独占しました。