如何让Celery公平地分配用户任务?
我正在做的任务是从一个网址抓取一些基本信息,比如标题、描述和OGP元数据。如果用户A请求抓取200个网址,而用户B随后请求抓取10个网址,那么用户B可能会等得比他/她预期的时间要长得多。
我想实现的是对每个用户的特定任务进行速率限制,或者至少在用户之间做到公平。
使用Celery来实现速率限制的方法太宽泛了,因为它只根据任务名称来限制。
你有什么建议可以实现这种公平性吗?
3 个回答
0
解决这个问题的一种方法是限制用户排队的任务数量,比如说不让每个用户排队超过x个任务。这意味着我们需要统计每个用户已经排队但还没有处理的任务数量(这个统计是在Django这边进行的,不是用Celery来做)。
0
怎么样,干脆把每个网址的抓取都单独做成一个任务,而不是把所有的抓取都放在一个任务里?然后可以把这些任务作为链条或组来运行。
1
另一种方法是对每个用户进行限制,使用一个锁。可以用用户的ID作为锁的名字。如果这个锁已经被占用,就等一段时间再试。
简单来说,就是这样:
对用户ID加锁,如果锁无法获取,就重试,而不是干等着不动。此外,使用Redis会比Django的缓存更好,不过两者都可以用。