【问题标题】:Is it possible to set "worker_prefetch_multiplier" for each queue separately in Celery?是否可以在 Celery 中分别为每个队列设置“worker_prefetch_multiplier”?
【发布时间】:2021-06-06 03:22:42
【问题描述】:

我想知道是否可以为队列设置不同的预取乘数。

我有 2 个队列,一个运行的任务非常短,另一个稍长一些。较短任务的队列需要优先于其他任务。

为了确保优先级工作可靠,必须在 celery 配置中进行设置:

task_acks_late = True
worker_prefetch_multiplier = 1

但是,这确实会损害快速任务队列的性能。是否可以配置,如果worker从快速任务队列中获取,worker_prefetch_multiplier是4,如果worker从慢任务队列中获取worker_prefetch_multiplier是1?

【问题讨论】:

  • 据我所知这是不可能的。最简单的解决方案是运行两个工作人员,每个工作人员都使用预取的预取乘数值订阅特定队列。

标签: python python-3.x celery


【解决方案1】:

我不确定自 the Celery documentation seems to set these limits per worker 以来是否可以为每个队列定义不同的预取限制。

但是,我们通过为每个队列启动不同的工作程序来解决此问题。您可以为每个工作人员定义不同的预取限制 - 如果一个工作人员只使用一个队列,您还可以定义不同的预取限制以及每个队列的工作人员并发。这还有一个额外的好处,即您的长时间运行的任务不会阻塞工作人员处理短期任务的时间。 如果您有任何机会考虑使用celery-batches 来进一步加快处理短期任务的速度,那么将队列分离到不同的工作人员就变得更加重要,因为您希望为该工作人员定义相当高的预取限制(注意:如果您的预取限制为 0 并且您的队列非常满,您最终将耗尽内存。

在我们的例子中,我们在一个容器化的环境中运行我们的工作人员。这使我们甚至可以为每个工作人员/队列独立定义资源分配(内存/cpu)。

【讨论】:

  • 这是一个很好的答案!我实际上打算为此更深入地研究 celery/kombu,但似乎将它分成多个工人更方便。
  • 谢谢,我们为员工使用 celery 已经有一段时间了,最​​近我尝试优化我们项目的特定部分 :-)
  • 在我的案例中,worker 有点占用内存,而且并不总是存在长时间运行的任务。对于被指定执行更长运行任务的工作人员,是否也可以侦听具有较低优先级的短任务队列是否有意义?我对 celery 的熟悉程度还处于初级阶段,但是有多个工人听同一个队列有什么风险吗?
  • 我们没有这样做 - 只是因为我们正在根据工作负载自动扩展我们的 kubernetes 集群中的工作人员。让多个工作人员在同一个队列上监听是没有风险的,celery 依靠它的后端来处理 - 在我们的例子中是 RabbitMQ。
猜你喜欢
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
相关资源
最近更新 更多