首页 > 解决方案 > 使用 Django Celery 向远程 API 发送批量请求的更好方法?

问题描述

我的 Django 网站上有包含 24K 用户的用户表,我需要通过向速率受限(15 个请求/分钟)的远程 API 端点发送请求来检索每个用户的信息。

所以我的计划是使用 Celery 周期性任务和一个名为“Job”的新模型。在我看来有两种方法:
1. 对于每个用户,我将创建一个新的 Job 实例,该实例具有与该用户的 ForeignKey 关系。
2. 将有一个 Job 实例,并且此 Job 实例将有一个“users”ManyToManyField 字段。

然后我将使用 Celery 处理 Job 实例,例如,对于上述第一种方式,我可以在每次运行定期任务时处理一个 Job 实例。但是..每个批量请求系列都会有大量的数据库对象......

它们对我来说似乎都很糟糕,因为它们都是大负载的操作。我错了吗?我想应该有更方便的方法。您能否建议我一个更好的方法,或者我的方法足以实施?

标签: djangodjango-celerybulkdjango-celery-beat

解决方案


您可以向您的用户模型添加一个字段last_updated,然后您可以设置一个任务以每分钟运行一次,选择最后更新的 15 个用户

class User(AbstractUser):
    last_updated = models.DateTimeField(default=timezone.now, db_index=True)

def task():
    users = User.objects.order_by('last_updated')[:15]
    for user in users:
        # perform API call and update user.last_updated to be now

这样您就不必设置复杂的作业队列/表


推荐阅读