优先考虑芹菜中多个队列中的队列?

时间:2017-09-13 18:52:20

标签: celery celery-task

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

问题:

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

虽然这种方法存在问题。它没有采用后备式方法。 因为,监听多个队列的工作人员在其中均匀分配资源。

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

答案 1 :(得分: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,并在检查Q1之前执行Q2任务。

source

不提供主题帮助,它也适用于Airflow 1.10.2辅助程序,除了似乎未从命令行保留队列顺序。使用'queue_order_strategy'='sorted'并适当地命名队列可以正常工作(Q1,Q2可以正常工作)。 dag之间不会保留基于气流池的优先级,因此确实有帮助!

答案 2 :(得分:0)

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

最佳解决方案是启动2名工人。 1表示低优先级,1表示高优先级,n处理。

当没有高优先级任务时,具有低优先级任务的工作人员将使用所有资源,反之亦然。如果有这两个任务,资源将均匀分布。