【问题标题】:send_task works only with a specific usersend_task 仅适用于特定用户
【发布时间】:2018-01-21 10:09:27
【问题描述】:

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

有两个兔子用户:

  • admin_user,权限为.* .* .*
  • remote_user,权限为ack ack ack

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

remote_user 只能触发一种类型的任务 - ack 并被排入专用的 ack 队列,该队列随后被 ack 工作人员(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 后,它不再发送任务。该调用返回AsyncResult,但我在 Celery 花(或通过兔子管理 ui)或日志中看不到该消息。

  • 尝试将权限设置为 remote_user .* .* .* 就像在 admin_user 中一样 - 没有帮助。
  • 尝试添加administrator 标签 - 没有帮助。

将代理的用户更改为 'amqp://admin_user:admin_pass@&lt;machine_ip&gt;: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 权限。 知道我能做什么吗?

【问题讨论】:

    标签: rabbitmq celery amqp celery-task rabbitmqctl


    【解决方案1】:

    已解决, 我猜 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'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2016-12-09
      • 2017-12-31
      • 1970-01-01
      • 2016-03-11
      相关资源
      最近更新 更多