【问题标题】:How to put a rate limit on a celery queue?如何对芹菜队列设置速率限制?
【发布时间】:2015-03-29 15:55:07
【问题描述】:

我在celery documentation for Task.rate_limit看到这个:

请注意,这是每个工作实例的速率限制,而不是全局速率限制。要强制执行全局速率限制(例如,对于具有每秒最大请求数的 API),您必须限制给定队列。

如何对 celery 队列设置速率限制?

【问题讨论】:

标签: celery


【解决方案1】:

事实证明它不能在队列级别为多个工作人员完成。 IT 可以在队列级别为 1 名工作人员完成。或者在每个工作人员的队列级别。

所以如果你说 5 个工人每分钟 10 个工作。您的工作人员每分钟将共同处理多达 50 个作业。

因此,要一次只运行 10 个作业,您要么选择一名工人。或者选择 5 个工人,限制为 2 个/分钟。

更新:如何在设置/配置中准确设置限制:

task_annotations = {'tasks.<task_name>': {'rate_limit': '10/m'}}

或对所有任务进行相同的更改:

task_annotations = {'*': {'rate_limit': '10/m'}}

10/m 表示每分钟 10 个任务,/s 表示每秒。更多细节在这里:Task annotations setting

【讨论】:

  • 一些细节怎么样 - 例如你到底是怎么告诉工人只做“2/分钟”的?
  • @spookylukey 在下面看到我的回答
  • 在搜索了这个问题的答案后,我发现限速只能在任务级别上进行。 Celery 不支持队列级限速。
  • 那么有没有办法动态获取工人数量,然后是动态速率限制?
  • 对于 2019 年,我创建了一个示例,说明如何在使用 Celery + Django + Redis 时将速率限制集成到您的任务中(在放弃 Celerys 缺乏速率限制功能或文档之后,这可能是故意的由于不同的应用程序要求):gist.github.com/Vigrond/2bbea9be6413415e5479998e79a1b11a
【解决方案2】:

您可以在花 > 工作窗格中设置此限制。 有一个指定的空白区域用于输入您的限制。 建议使用的格式也如下:

可以通过将“/s”、>“/m”或“/h”附加到值来以秒、分钟或小时为单位指定速率限制。任务将在指定的 >时间范围内平均分配。

示例:“100/m”(每分钟一百个任务)。这将强制在同一工作实例上启动两个任务之间的最小延迟 >600 毫秒。

【讨论】:

  • 您可以在Flower上仅对任务级别设置速率限制。 Celery 不支持队列级限速。
【解决方案3】:

嘿,我正在尝试找到一种方法来限制队列的速率,我发现 Celery 不能这样做,但是 Celery 可以控制每个任务的速率,请参见:

http://docs.celeryproject.org/en/latest/userguide/workers.html#rate-limits

因此,作为一种解决方法,也许您可​​以为每个队列设置一个任务(这在很多情况下都很有意义),并限制任务。

【讨论】:

  • 这个rate_limit 也是每个工作人员而不是每个任务。如果您有两个工人在执行该任务,则速率限制实际上会加倍,依此类推。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2018-05-04
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多