【问题标题】:Prioritizing queues among multiple queues in celery?在芹菜的多个队列中优先考虑队列?
【发布时间】:2018-02-22 14:22:17
【问题描述】:

我们将 celery 用于异步后台任务,并且我们有 2 个队列用于不同优先级的任务。我们有 2 个节点集群分别为它们服务。事情进展顺利。

问题:

我们主要处理低优先级的任务。为了优化资源利用率,我想知道有没有办法配置工作人员(监听高优先级队列)来监听两个队列。但是只要有一些工作就可以从更高优先级队列中获取工作吗?否则回退到低优先级队列。

我已经完成了@Celery Task Priority 讨论的基于优先级的任务调度。

但我的问题是优先队列,而不仅仅是队列中的任务。

【问题讨论】:

    标签: celery celery-task


    【解决方案1】:

    现在可以使用 Celery >= 4.1.1 + Redis 传输(也可能是早期版本)。您只需在 celeryconfig.py 模块中设置代理传输选项。此设置是使用 Kombu 4.0.0 实现的。

    broker_transport_options = {
      visibility_timeout: 1200,  # this doesn't affect priority, but it's part of redis config
      queue_order_strategy: 'priority'
    }
    

    也可以使用环境变量来指定。

    对于一个工人开始 $ celery -A proj worker -l info -Q Q1,Q2 空闲的工作人员将首先检查 Q1 并在检查 Q2 之前执行 Q1 任务(如果可用)。

    source

    额外的主题帮助,这也适用于 Airflow 1.10.2 工作人员,但似乎没有从命令行保留队列顺序。使用'queue_order_strategy'='sorted' 并适当地命名您的队列是可行的(Q1、Q2 将完美运行)。 dag 之间不会保留基于气流池的优先级,所以这真的很有帮助!

    【讨论】:

      【解决方案2】:

      您可以通过在启动工作程序时为工作程序定义多个队列来部分实现此目的。

      您可以使用以下命令执行此操作:另外,请参阅 here 了解更多详细信息。

      celery -A proj worker -l info -Q Q1,Q2
      

      虽然这种方法有问题。它不能通过后备方式来做到这一点。 因为,监听多个队列的工作人员在它们之间平均分配资源。

      因此,即使“正常优先级队列”中有某些内容,您也无法实现仅从“高优先级队列”处理的要求。 这可以通过为“高优先级队列”分配更多的工人(可能是 75%)和为“普通优先级队列”分配 25% 来最小化。或根据您的工作量分配不同的份额。

      【讨论】:

        【解决方案3】:

        不幸的是,开箱即用的芹菜是不可能的。

        最佳解决方案是启动 2 个工人。 1 表示低优先级,其他表示具有 n 个进程的高优先级。

        当没有高优先级任务时,低优先级任务的worker会使用所有资源,反之亦然。如果有两个任务,资源将被平均分配。

        【讨论】:

        • 这可以是一个解决方案。我会试试的。
        猜你喜欢
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 2019-09-03
        • 2014-06-09
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多