私は Celery を RabbitMQ バックエンドで使用して、Fedora で非同期バックグラウンド タスクを実行しようとしていますが、イライラするほど信頼性が低いと感じています。最大の問題は、同じタスクを複数回実行することがあり、その理由を診断するのに苦労しています。
(db レコードを作成する) タスクを手動で 1 回起動してテストしたところ、2 つの同一のレコードが作成されていることがわかりました。Django シェルからコードを実行すると、レコードが 1 つしか作成されないため、問題は間違いなく Celery にあるようです。
それぞれ celeryd を実行している 3 つのサーバーがあり、最初に実行されている rabbitmq のみがあり、3 つのサーバーすべてが同じデータベースを共有しています。私の最初の経験は、セロリの設定に問題があり、各サーバーのセロリドが同じタスクを取得して実行することでした。ただし、セロリのドキュメントには、単一ホストと複数ホストのセットアップを区別するものは何もないように思われるため、各サーバーの settings.py で正しい BROKER_HOST/PORT/USER/PASSWORD/VHOST を指定したと仮定すると、「ただ複数のホストで動作します。これは正しいです?
私が持っていたもう1つの考えは、これを確認する方法がわかりませんが、どういうわけか複数のcelerydインスタンスを実行している可能性があるということでした. 2 台のサーバーで Fedora 13 が実行されており、実行すると次のようps aux | grep .*.py
になります。
root 24806 0.1 1.8 51404 31328 ? Sl Oct19 9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root 24900 0.1 1.6 51404 28592 ? S Oct19 6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root 24901 0.3 9.4 183232 161948 ? S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
これは、celeryd の 3 つの別々のインスタンスが実行されていることを示していますか? もしそうなら、これはエラーで、2匹殺すべきですか?
私の 3 番目のサーバーは、異なるサービス フレームワークを持つ Fedora 17 を実行しています。実行すると、次のようsystemctl status celeryd.service
になります。
celeryd.service - LSB: celery task worker daemon
Loaded: loaded (/etc/rc.d/init.d/celeryd)
Active: active (exited) since Fri, 19 Oct 2012 10:59:38 -0400; 4 days ago
Process: 732 ExecStop=/etc/rc.d/init.d/celeryd stop (code=exited, status=0/SUCCESS)
Process: 738 ExecStart=/etc/rc.d/init.d/celeryd start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/celeryd.service
これをどう解釈していいのかわからない。「アクティブ」は通常実行されていますが、「終了」は通常実行されていないことを意味します。実行するps aux | grep .*celery.*
と、次のようになります。
root 25142 0.0 0.0 109400 932 pts/0 S+ 11:28 0:00 grep --color=auto .*celery.*
これは celeryd が実行されていないことを意味しますか、それとも何か他のものを探す必要がありますか?
編集:この回答に基づいて、3 つのプロセスがデフォルトである可能性があると思います。