6

サーバー上で2つの別々のcelerydプロセスが実行されており、によって管理されていますsupervisor。それらは、次のように別々のキューでリッスンするように設定されています。

[program:celeryd1]
command=/path/to/celeryd --pool=solo --queues=queue1
...

[program:celeryd2]
command=/path/to/celeryd --pool=solo --queues=queue2
...

そして、私のceleryconfigは次のようになります。

from celery.schedules import crontab

BROKER_URL = "amqp://guest:guest@localhost:5672//"

CELERY_DISABLE_RATE_LIMITS = True
CELERYD_CONCURRENCY = 1
CELERY_IGNORE_RESULT = True

CELERY_DEFAULT_QUEUE = 'default'
CELERY_QUEUES = {
    'default': {
        "exchange": "default",
        "binding_key": "default",
    },
    'queue1': {
        'exchange': 'queue1',
        'routing_key': 'queue1',
    },
    'queue2': {
        'exchange': 'queue2',
        'routing_key': 'queue2',
    },
}

CELERY_IMPORTS = ('tasks', )

CELERYBEAT_SCHEDULE = {
    'first-queue': {
        'task': 'tasks.sync',
        'schedule': crontab(hour=02, minute=00),
        'kwargs': {'client': 'client_1'},
        'options': {'queue': 'queue1'},
    },
    'second-queue': {
        'task': 'tasks.sync',
        'schedule': crontab(hour=02, minute=00),
        'kwargs': {'client': 'client_2'},
        'options': {'queue': 'queue1'},
    },
}

すべてのtasks.syncタスクは特定のキューにルーティングする必要があります(したがって、celerydの進行状況)。しかし、私がsync.apply_async(kwargs={'client': 'value'}, queue='queue1')両方のセロリ労働者でタスクを手動で実行しようとすると、タスクを取得します。タスクを正しいキューにルーティングし、キューにバインドされているワーカーによってのみ実行されるようにするにはどうすればよいですか?

4

1 に答える 1

7

celerybeat インスタンスを 1 つしか実行していませんか?

たぶん、これと衝突する古いキューバインディングがありますか? rabbitmqctl list_queues実行してみてくださいrabbitmqctl list_bindings。ブローカのデータをリセットして、最初からやり直すこともできます。

ここにある例は機能するはずであり、試してみたところうまくいきました。

ヒント: キュー名と同じ exchange および binding_key 値を使用しているため、それらを CELERY_QUEUES に明示的にリストする必要はありません。celeryd -Q queue1CELERY_CREATE_MISSING_QUEUES がオン (デフォルト) の場合、未定義のキューにタスクを実行または送信した場合とまったく同じように、キューが自動的に作成されます。

于 2012-04-10T12:50:13.590 に答える