如何让Celery公平地分配用户任务?

1 投票
3 回答
2171 浏览
提问于 2025-04-18 00:39

我正在做的任务是从一个网址抓取一些基本信息,比如标题、描述和OGP元数据。如果用户A请求抓取200个网址,而用户B随后请求抓取10个网址,那么用户B可能会等得比他/她预期的时间要长得多。

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

使用Celery来实现速率限制的方法太宽泛了,因为它只根据任务名称来限制

你有什么建议可以实现这种公平性吗?

相关 Celery (Django) 速率限制

3 个回答

0

解决这个问题的一种方法是限制用户排队的任务数量,比如说不让每个用户排队超过x个任务。这意味着我们需要统计每个用户已经排队但还没有处理的任务数量(这个统计是在Django这边进行的,不是用Celery来做)。

0

怎么样,干脆把每个网址的抓取都单独做成一个任务,而不是把所有的抓取都放在一个任务里?然后可以把这些任务作为链条或组来运行。

1

另一种方法是对每个用户进行限制,使用一个锁。可以用用户的ID作为锁的名字。如果这个锁已经被占用,就等一段时间再试。

简单来说,就是这样:

确保一个任务一次只执行一次

对用户ID加锁,如果锁无法获取,就重试,而不是干等着不动。此外,使用Redis会比Django的缓存更好,不过两者都可以用。

撰写回答