我们使用 celery 来执行异步后台任务,并且有 2 个队列用于不同优先级的任务。我们有 2 个节点集群分别为它们提供服务。事情进展顺利,正如预期的那样。
问题:
我们得到的大多是低优先级的任务。为了优化资源利用率,我想知道是否有一种方法可以配置工作人员(侦听高优先级队列)来侦听两个队列。但是,只要有作业存在,就从较高优先级队列中获取作业吗?否则回退到低优先级队列。
我已经讨论过@讨论的基于优先级的任务调度Celery 任务优先级 https://stackoverflow.com/questions/43618214/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'
}
也可以使用环境变量来指定。
对于一个开始于$ celery -A proj worker -l info -Q Q1,Q2
空闲的worker会先检查Q1并执行Q1
检查之前的任务(如果有)Q2
.
source http://docs.celeryproject.org/projects/kombu/en/latest/reference/kombu.transport.redis.html#kombu.transport.redis.Channel.queue_order_strategy
奖金题外话帮助,这也适用于 Airflow 1.10.2 工作人员,除了看起来队列顺序不是从命令行保留的。使用'queue_order_strategy'='sorted'
并适当地命名您的队列(Q1、Q2 可以完美工作)。基于气流池的优先级在 dag 之间不会保留,因此这确实有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)