在芹菜的多个队列中优先考虑队列?
Prioritizing queues among multiple queues in celery?
我们将 celery 用于我们的异步后台任务,我们有 2 个队列用于不同优先级的任务。我们有 2 个节点集群分别为它们服务。一切如预期般运作良好。
问题:
我们得到的大多是低优先级的任务。为了优化资源利用率,我想知道是否有一种方法可以配置工作人员(监听高优先级队列)来监听两个队列。但是只要有工作就从优先级更高的队列中获取工作?否则回退到低优先级队列。
我已经完成了讨论的基于优先级的任务调度@。
但我的问题是优先队列,而不仅仅是队列中的任务。
不幸的是,开箱即用的芹菜是不可能的。
最佳解决方案是启动 2 个工人。 1 表示低优先级,其他表示具有 n 个进程的高优先级。
当没有高优先级任务时,低优先级任务的工作人员将使用所有资源,反之亦然。如果有两个任务,资源将被平均分配。
您可以通过在启动时为工作程序定义多个队列来部分实现此目的。
您可以使用以下命令执行此操作:另外,请参阅 here 了解更多详细信息。
celery -A proj worker -l info -Q Q1,Q2
虽然这种做法有问题。它不使用后备方法来做到这一点。
因为,收听多个队列的工作人员在他们之间平均分配资源。
因此,即使 'normal priority queue' 中有内容,您要求仅从 'high priority queue' 处理的要求也无法实现。
这可以通过为 'high priority queue' 分配更多的工人(可能是 75%)和为 'normal priority queue' 分配 25% 来最小化。或根据您的工作量分配不同的份额。
现在可以使用 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 并在检查 Q2
.
之前执行 Q1
任务(如果可用)
额外的题外帮助,这也适用于 Airflow 1.10.2 工作人员,除了似乎没有从命令行保留队列顺序。使用 'queue_order_strategy'='sorted'
并适当地命名你的队列是有效的(Q1,Q2 可以完美地工作)。基于气流池的优先级不会在 dag 之间保留,所以这真的很有帮助!
我们将 celery 用于我们的异步后台任务,我们有 2 个队列用于不同优先级的任务。我们有 2 个节点集群分别为它们服务。一切如预期般运作良好。
问题:
我们得到的大多是低优先级的任务。为了优化资源利用率,我想知道是否有一种方法可以配置工作人员(监听高优先级队列)来监听两个队列。但是只要有工作就从优先级更高的队列中获取工作?否则回退到低优先级队列。
我已经完成了讨论的基于优先级的任务调度@
但我的问题是优先队列,而不仅仅是队列中的任务。
不幸的是,开箱即用的芹菜是不可能的。
最佳解决方案是启动 2 个工人。 1 表示低优先级,其他表示具有 n 个进程的高优先级。
当没有高优先级任务时,低优先级任务的工作人员将使用所有资源,反之亦然。如果有两个任务,资源将被平均分配。
您可以通过在启动时为工作程序定义多个队列来部分实现此目的。
您可以使用以下命令执行此操作:另外,请参阅 here 了解更多详细信息。
celery -A proj worker -l info -Q Q1,Q2
虽然这种做法有问题。它不使用后备方法来做到这一点。 因为,收听多个队列的工作人员在他们之间平均分配资源。
因此,即使 'normal priority queue' 中有内容,您要求仅从 'high priority queue' 处理的要求也无法实现。 这可以通过为 'high priority queue' 分配更多的工人(可能是 75%)和为 'normal priority queue' 分配 25% 来最小化。或根据您的工作量分配不同的份额。
现在可以使用 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 并在检查 Q2
.
Q1
任务(如果可用)
额外的题外帮助,这也适用于 Airflow 1.10.2 工作人员,除了似乎没有从命令行保留队列顺序。使用 'queue_order_strategy'='sorted'
并适当地命名你的队列是有效的(Q1,Q2 可以完美地工作)。基于气流池的优先级不会在 dag 之间保留,所以这真的很有帮助!