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