芹菜如何公平地分配用户的任务?



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

我试图实现的是在每个用户的基础上对特定任务进行速率限制,或者至少在用户之间公平。

用于速率限制的 Celery 实现过于宽泛,因为它仅使用任务名称

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

相关芹菜(姜戈)速率限制

另一种方法是使用锁对单个用户进行速率限制。使用用户 ID 作为锁名。如果锁定已保持,请在一些与任务相关的延迟后重试。

基本上,这样做:

确保一次只执行一个任务

锁定用户 ID 并重试,而不是在无法获取锁定时不执行任何操作。此外,最好使用 Redis 而不是 Django 缓存,但无论哪种方式都可以。

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

与其在单个任务中运行所有 URL 抓取,不如将每个抓取放入单个任务中,然后将它们作为链或组运行?

最新更新