我们正在使用celery进行异步后台任务,我们有2个队列用于不同的优先级任务。我们有2个节点集群分别为它们服务。事情进展顺利。
问题:
我们主要获得低优先级的任务。为了优化资源利用率,我想知道是否有一种方法可以配置工作者(监听高优先级队列)来监听两个队列。但只要有一些工作,就从优先级较高的队列中获取工作?否则回退到低优先级队列。
我已经完成了@ Celery Task Priority讨论的基于优先级的任务调度。
但我的问题是优先排队,而不仅仅是队列中的任务。
答案 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
任务。
不提供主题帮助,它也适用于Airflow 1.10.2辅助程序,除了似乎未从命令行保留队列顺序。使用'queue_order_strategy'='sorted'
并适当地命名队列可以正常工作(Q1,Q2可以正常工作)。 dag之间不会保留基于气流池的优先级,因此确实有帮助!
答案 2 :(得分:0)
不幸的是,开箱即用芹菜是不可能的。
最佳解决方案是启动2名工人。 1表示低优先级,1表示高优先级,n处理。
当没有高优先级任务时,具有低优先级任务的工作人员将使用所有资源,反之亦然。如果有这两个任务,资源将均匀分布。