我实施的任务与刮取一些URL的基本信息有关,例如标题,描述和OGP元数据。如果用户A要求抓取200个URL,并且在用户B请求10个URL之后,用户B可能会等待比他/他期望的更多。
我想要实现的目标是对每个用户的特定任务进行评级,或者至少在用户之间保持公平。
以来,速度限制的Celery实施过于宽泛你有什么建议可以实现这种公平吗?
答案 0 :(得分:1)
另一种方法是使用锁定对单个用户进行速率限制。使用用户标识作为锁定名称。如果在某些任务相关的延迟之后锁已经被重试。
基本上,这样做:
Ensuring a task is only executed one at a time
锁定用户ID并重试,如果无法获取锁定,则不执行任何操作。此外,最好使用Redis而不是Django缓存,但无论哪种方式都可以使用。
答案 1 :(得分:0)
解决这个问题的一种方法是控制用户不会排队超过x个任务,这意味着为每个用户计算排队的未处理任务的数量(在django方面,而不是尝试使用芹菜)。
答案 2 :(得分:0)
如果不是在一个任务中运行所有URL抓取,而是将每个抓取到一个任务中,然后将它们作为chains or groups运行?