我们正在使用芹菜进行异步背景任务,并且有2个队列以用于不同的优先任务。我们有2个节点群,分别提供它们。事情按预期运作良好。
问题:
我们获得的优先任务大多是低优先级任务。为了获得优化的资源利用,我想知道是否有一种方法可以配置工人(聆听高优先级队列)以聆听两个队列。但是,只要有一些工作,就可以从更高的优先级队列中拿起工作?
,后备到低优先级队列。我已经仔细讨论了基于优先级的任务调度 @芹菜任务优先级。
但是我的问题是优先排序队列,而不仅仅是队列中的任务。
现在可以使用芹菜> = 4.1.1 redis传输(也可能较早的版本)。您只需要在celeryconfig.py
模块中设置经纪运输选项即可。使用Kombu4.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
之前可用。
来源
奖励主题帮助,这也适用于气流1.10.2工人,除了似乎没有从命令行保留队列订单。使用'queue_order_strategy'='sorted'
并命名队列适当地工作(Q1,Q2可以很好地工作)。DAG之间没有保留气流池的优先级,因此确实有帮助!
您可以通过定义工人的多个队列来部分实现这一目标。
您可以使用以下命令来完成:另请参阅此处的更多详细信息。
celery -A proj worker -l info -Q Q1,Q2
尽管这种方法有问题。它不会使用后备方法来做到这一点。由于,听取多个队列的工人在其中均匀分发资源。
因此,即使无法实现"正常优先级队列"中的某些东西,您也只能从"高优先级队列"处理。可以通过为"高优先级队列"分配更多工人(可能为75%)和"正常优先级队列"的25%来最小化这一点。或根据您的工作负载不同的份额。
不幸的是,芹菜开箱即用。
最佳解决方案是启动2名工人。1对于低优先级,其他n过程的优先级。
当没有高优先级任务时,具有较低优先任务的工人将使用所有资源,反之亦然。如果这两个任务都将均匀分配。