aru*_*nk2 9 celery celery-task
我们使用celery进行异步后台任务,我们有2个队列用于不同的优先级任务.我们有2个节点集群分别为它们服务.事情正如预期的那样运作良好.
题:
我们主要得到低优先级的任务.为了优化资源利用率,我想知道有没有办法配置工作者(监听高优先级队列)来监听两个队列.但只要有一些工作,就从优先级较高的队列中获取工作?否则,回退到低优先级队列.
我已经完成了@ Celery Task Priority讨论的基于优先级的任务调度.
但我的问题是优先排队,而不仅仅是队列中的任务.
现在可以使用 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'
}
Run Code Online (Sandbox Code Playgroud)
也可以使用环境变量进行指定。
对于以$ celery -A proj worker -l info -Q Q1,Q2
空闲工作器启动
的工作器,将首先检查 Q1 并Q1在检查之前执行任务(如果可用)Q2。
额外的主题帮助,这也适用于 Airflow 1.10.2 工作人员,除了队列顺序似乎没有从命令行保留。'queue_order_strategy'='sorted'适当地使用和命名您的队列有效(Q1、Q2 可以完美运行)。dag 之间不会保留基于气流池的优先级,因此这确实有帮助!
您可以通过在启动工作线程时为其定义多个队列来部分实现此目的。
您可以使用以下命令来完成此操作:另外,请参阅此处了解更多详细信息。
celery -A proj worker -l info -Q Q1,Q2
Run Code Online (Sandbox Code Playgroud)
虽然这种方法有一个问题。它不采用后备方式来做到这一点。因为,监听多个队列的工作人员在它们之间均匀分配资源。
因此,即使“普通优先级队列”中有某些内容,也无法实现仅从“高优先级队列”进行处理的要求。通过为“高优先级队列”分配更多的 Worker(可能为 75%)和为“普通优先级队列”分配 25%,可以最大限度地减少这种情况。或根据您的工作量分配不同的份额。