【问题标题】:Celery worker: How to consume from all queues?芹菜工人:如何从所有队列中消费?
【发布时间】:2014-11-24 22:39:48
【问题描述】:

我有

  • 设置CELERY_CREATE_MISSING_QUEUES = True
  • 未定义CELERY_QUEUES
  • 定义CELERY_DEFAULT_QUEUE = 'default'(直接类型)
  • 一个自定义路由类,它可以动态创建路由,如图所示 这张票 (https://github.com/celery/celery/issues/150)。

我看到自定义路由器返回的路由中的新队列被创建,我认为这是因为CELERY_CREATE_MISSING_QUEUES。

现在在我运行的工作节点中,我没有传递 -Q 参数,它仅从“默认”队列中消耗,这似乎与文档一致 -

默认情况下,它将消耗所有定义在 CELERY_QUEUES 设置(如果未指定,则默认为队列 命名为芹菜)。

有什么方法可以让我的工作节点从所有队列中消费,包括动态创建的队列?

谢谢,

【问题讨论】:

    标签: python celery


    【解决方案1】:

    工作人员需要被告知这些自动或动态创建的队列,因此您需要一种方法来获取这些队列名称并在创建它们时存储它们,或者如果您使用 RabbitMQ 作为可能从rabbitmqctl list_queues 获取它们代理,例如添加一个信号处理程序以将这些动态队列添加到工作人员以进行消费。

    例如使用celeryd_after_setup信号:

    from celery.signals import celeryd_after_setup
    
    @celeryd_after_setup.connect
    def add_dynamic_queue(sender, instance, **kwargs):
        # get the dynamic queue, maybe stored somewhere
        queue = 'dynamic_queue'
        instance.app.amqp.queues.select_add(queue)
    

    如果您总是创建新的动态队列,您还可以使用以下命令命令工作人员在运行时从这些队列中开始消费:

    #command all workers to consume from the 'dynamic_queue' queue
    app.control.add_consumer('dynamic_queue', reply=True)
    
    # command specific workers
    app.control.add_consumer('dynamic_queue', reply=True, destination=[w1@example])
    

    见Adding Consumers。

    我希望这会有所帮助,当我获得更多信息时,我会编辑问题。

    【讨论】:

    • 谢谢。那很有趣。是的,我使用 RabbitMQ,并且我一直计划使用动态队列。我希望我可以告诉工作人员使用某种通配符模式从所有队列中消费。我现在要试试你的建议。问题 - 考虑到工作人员可以在不同的服务器上运行,消息代理是唯一的共同部分,app.control.add_consumer(...) 如何将信息传递给工作人员?
    • @ksrini 是的,我正在搜索源代码以查找是否可以使用通配符模式,但是设​​置要使用的队列的方法需要一个用逗号分隔的队列列表。并且控制命令使用代理(RabbitMQ)将消息广播给工作人员检查模块celery.app.control。
    • 您建议的使用 add_consumer 控制命令的方法有效!谢谢!我只想在工作人员尚未从该队列中消费时才调用 add_consumer 因为 add_consumer 似乎需要一些时间(大约 1-2 秒)如果回复 = True 并且我打算从我确定的路由器执行它新队列作为路线的一部分。如果我设置reply=False,它会更快。即使工人可能已经从该队列消费,您是否发现调用 add_consumer 有任何问题?
    • @ksrini 添加队列的方法Consumer.add_task_queue 检查队列是否已经在列表中,以及工作人员是否正在从中消费,所以不用担心。
    • @ksrini 在搜索有关此问题的更多信息时,我在Google groups 上找到了由 Celery 的作者 Ask Solem 发表的关于从动态队列消费的帖子,他说 No, you would have to add that capability to the worker by using the signals and storing the configuration somewhere, and load them at startup。
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2023-04-08
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2017-04-23
    相关资源
    最近更新 更多