8

特定の django サイト インスタンスのすべてのタスクを特定のキューにルーティングする必要があります。私のセットアップは次のとおりです。

  • Django プロジェクト (1.7) を実行する複数の Web サーバー
  • セロリワーカーを実行する1つのサーバー(3.1.7)
  • 3 つの環境: 運用、ステージング、開発。各環境はDJANGO_SETTINGS_MODULE、異なるCELERY_DEFAULT_QUEUE設定の異なる で実行されます。
  • ブローカーとしての 1 つの redis インスタンス (すべて同じデータベース内)

「セロリ サーバー」で、スーパーバイザー (簡略化された conf) を介して複数のワーカー インスタンスを実行します。

[program:production_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.production
command=/pth/to/python celery -A website.celery worker --events --queues myserver --loglevel WARNING --concurrency 4 -n production@celery.myserver.nl

[program:staging_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.staging
command=/pth/to/python celery -A website.celery worker --events --queues myserver_staging --loglevel WARNING --concurrency 1 -n staging@celery.myserver.nl

[program:development_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.development
command=/pth/to/python celery -A website.celery worker --events --queues myserver_development --loglevel INFO --concurrency 1 -n development@celery.myserver.nl

これは、検査で機能します:

$ celery -A website.celery inspect activeues
-> production@celery.myserver.nl: OK
    * {u'exclusive': False, u'name': u'myserver', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> staging@celery.myserver.nl: OK
    * {u'exclusive': False, u'name': u'myserver_staging', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> development@celery.myserver.nl: OK
    * {u'exclusive': False, u'name': u'myserver_development', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}

(名前は CELERY_DEFAULT_QUEUE の設定に合わせます)

website/celery.py基本が含まれています(インポートはスキップされます):

app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

したがって、開発設定で実行されている Web サーバーによって生成されたタスクは、development_queue. ただし、タスクが別のキューまたは 3 つすべてによって処理されていることがわかりますが、これは問題です。

これがこれらのタスクを分離する良い方法であるという点で、私の期待は間違っていますか? ルーティングに関するすべてのドキュメントは、さまざまなタスクをさまざまなキューにルーティングすることに関するものですが、これは必要ありません。特定のサイト (環境) のすべてのタスクを特定のキューにルーティングする必要があります。これらの環境を分離するにはどうすればよいですか?

4

2 に答える 2

4

ここで Celery の開発者から回答を得ました: https://github.com/celery/celery/issues/2508、つまり:

CELERY_DEFAULT_QUEUE、 、のすべてを設定する必要がCELERY_DEFAULT_EXCHANGEありCELERY_DEFAULT_ROUTING_KEYます。そうしないと、3 つのキューがすべて同じ交換およびルーティング キーにバインドされることになります。

または、明示的に設定する次の方法を使用します: http://docs.celeryproject.org/en/latest/userguide/routing.html#changeing-the-name-of-the-default-queue

それはうまくいきます!

于 2015-12-12T11:20:24.743 に答える
1

私はあなたと同様の設定をしていますが、私の解決策は、開発、ステージング、および本番用に異なる RabbitMQ ブローカーを使用することです。

たとえば、私の個人的な開発設定ファイルには次のものがあります。

CELERY_BROKER = "librabbitmq://user:user@my_machine.domain.com/"

プロダクション設定ファイルには次のものがあります。

CELERY_BROKER = "librabbitmq://prop:prod@main_cluster.domain.com/"

私のセロリアプリモジュールには次のものがあります。

app = Celery('App', broker=settings.CELERY_BROKER)

これが役立つかどうかはわかりませんが、celery-users ボードであなたの投稿を見ましたが、他に応答がなかったため...

于 2015-11-11T13:20:36.810 に答える