1

私は 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 つのプロセスがデフォルトである可能性があると思います。

4

1 に答える 1

2

コメントに投稿しましたが、これがあなたの問題だと確信しています。こちらを参照してください。

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

3 回ビートであなたの実行中のセロリ。したがって、あなたの送信ビートメッセージは 3 回です。

Beat をオンにしたインスタンスを 1 つだけにするか、(できれば) celerybeat を単独で実行して、celeryd インスタンスの -B をオフにする必要があります。

于 2012-10-23T16:16:30.613 に答える