将芹菜任务路由到特定的queu

2024-10-04 05:29:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我的服务器上有两个独立的芹菜进程,由supervisor管理。它们被设置为监听单独的队列:

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

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

我的芹菜配置是这样的:

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任务都必须路由到一个特定队列(从而加快进度)。但是,当我尝试用sync.apply_async(kwargs={'client': 'value'}, queue='queue1')手动运行任务时,两个芹菜工人都会执行任务。如何将任务路由到正确的队列,并且只能由绑定到该队列的工作进程运行?


Tags: keyclientdefaultexchange队列queue进程sync
1条回答
网友
1楼 · 发布于 2024-10-04 05:29:27

你只运行一个芹菜拍实例对吧?

也许你有与此冲突的旧队列绑定? 尝试运行rabbitmqctl list_queuesrabbitmqctl list_bindings, 也许可以重新设置代理中的数据以从头开始。

你在这里举的例子应该有用,我刚试过的时候对我也有用。

提示:由于使用的交换和绑定密钥值与队列名称相同, 您不必在芹菜队列中明确列出它们。当西芹制造失踪队列时 启用(默认情况下为启用),队列将自动创建,与 如果您只是执行celeryd -Q queue1或将任务发送到未定义的队列。

相关问题 更多 >