【问题标题】:How can Celery distribute users' tasks in a fair way?Celery 如何公平地分配用户的任务?
【发布时间】:2014-03-31 10:53:36
【问题描述】:

我正在执行的任务与抓取有关 URL 的一些基本信息有关,例如标题、描述和 OGP 元数据。如果用户 A 请求 200 个 URL 进行抓取,并且在用户 B 请求 10 个 URL 后,用户 B 的等待时间可能比她/他预期的要长。

我想要实现的是对每个用户的特定任务进行速率限制,或者至少在用户之间做到公平。

用于速率限制的 Celery 实现过于宽泛,因为 it uses the task name only

您对实现这种公平有什么建议吗?

相关 Celery (Django) Rate limiting

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    另一种方法是使用锁对单个用户进行速率限制。使用用户 ID 作为锁名称。如果锁已被持有,在一些依赖于任务的延迟后重试。

    基本上,这样做:

    Ensuring a task is only executed one at a time

    锁定用户 ID,如果无法获得锁定,则重试而不是什么都不做。此外,最好使用 Redis 而不是 Django 缓存,但无论哪种方式都可以。

    【讨论】:

      【解决方案2】:

      解决此问题的一种方法可能是控制用户排队的任务不超过 x 个,这意味着为每个用户计算排队的未处理任务的数量(在 django 方面,不要尝试使用芹菜)。

      【讨论】:

        【解决方案3】:

        不如在单个任务中运行所有 URL 抓取,而是将每个抓取变成一个任务,然后以 chains or groups 运行它们?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-02
          • 2011-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多