使用动态routing_key启动worker?

时间:2014-09-08 09:09:11

标签: python celery

我有一个包含多个任务类型的队列,我需要为特定任务运行worker。 类似于:' celery worker --routing_key task.type1 --app = app'

队列配置:

CELERY_QUEUES = (
    Queue('myqueue',    routing_key='task.#'),
)
CELERY_DEFAULT_EXCHANGE_TYPE = 'topic'

使用pika任务很容易解决:http://www.rabbitmq.com/tutorials/tutorial-five-python.html但如何用芹菜做?

1 个答案:

答案 0 :(得分:3)

Np,您无法将worker绑定到routing_key。

  • 工作者使用队列而不是routing_key。
  • 生产者使用routing_key发送消息,该rabbitmq路由到队列。

pika也不可能。

在本教程中,worker / consumer将自己的队列绑定到路由键。

  1. 生产者使用路由键='info'
  2. 发出日志
  3. RabbitMQ将丢弃所有这些,直到队列绑定到此routing_key
  4. 接收者创建队列A并将其绑定到routing_key'info'
  5. 现在,rabbitmq使用routing_key'info'将日志路由到队列A,接收者使用它们
  6. 您可以使用芹菜轻松复制此绑定。

    例如,您可以在celery配置文件中执行此操作:

     exchange = Exchange('default', type=topic)
     CELERY_QUEUES = (
       Queue('all_logs', exchange, routing_key='logs.#'),
       Queue('info_logs', exchange, routing_key='logs.info')
      )
    

    收到所有日志:

    $ celery worker -A receive_logs -Q all_logs
    

    仅接收'info'日志(msg with routing_key = logs.info only)

    $ celery worker -A receive_logs -Q info_logs
    

    最后,你已经启动了一个只使用带有特定routing_key的msg的worker,这就是你想要的。

    注意:信息日志在队列中都重复:all_logs和Queue:info_logs

    您可能会对以下内容感兴趣: http://docs.celeryproject.org/en/latest/configuration.html?highlight=direct#std:setting-CELERY_WORKER_DIRECT