send_task 仅适用于特定用户

send_task works only with a specific user

设置: Celery 4.1,RabbitMQ 3.6.1(作为代理),Redis(作为后端,此处不相关)。

有两个兔子用户:

admin_user可以触发任务,被celery worker用来处理任务。

remote_user 只能触发一种类型的任务 - ack 并排入专用的 ack 队列,稍后由 ack worker 使用(由 admin_user).

remote_user通过以下代码发送任务:

from celery import Celery

app = Celery('remote', broker='amqp://remote_user:remote_pass@<machine_ip>:5672/vhost')
app.send_task('ack', args=('a1', 'a2'), queue='ack', route_name='ack')

这在 Celery 3.1 中完美运行。升级到 Celery 4.1 后,它不再发送任务。调用 returns 和 AsyncResult 但我没有在芹菜花(或通过兔子管理 ui)或日志中看到消息。

将经纪人的用户更改为 'amqp://admin_user:admin_pass@<machine_ip>:5672/vhost' 有效:

from celery import Celery

app = Celery('remote', broker='amqp://admin_user:admin_pass@<machine_ip>:5672/vhost')
app.send_task('ack', args=('a1', 'a2'), queue='ack', route_name='ack')

但我不想给远程机器 admin_user 权限。 知道我能做什么吗?

已解决, 我猜 API 已更改,但为了保持 RabbitMQ 的当前权限,我不得不使用以下路径:

old_celery_config.py:(芹菜 3.1)

CELERY_ROUTES = {
    'ack_task': {
        'queue': 'geo_ack'
    }
}

celery_config.py:(芹菜 4.1)

CELERY_ROUTES = {
    'ack_task': {
        'exchange': 'ack',
        'exchange_type': 'direct',
        'routing_key': 'ack'
    }
}

run_task.py:

from celery import Celery

app = Celery('remote', broker='amqp://remote_user:remote_pass@<machine_ip>:5672/vhost')
app.config_from_object('celery_config')
app.send_task('ack_task', args=('a1', 'a2'))