django - 使用 Django Celery 向远程 API 发送批量请求的更好方法?
问题描述
我的 Django 网站上有包含 24K 用户的用户表,我需要通过向速率受限(15 个请求/分钟)的远程 API 端点发送请求来检索每个用户的信息。
所以我的计划是使用 Celery 周期性任务和一个名为“Job”的新模型。在我看来有两种方法:
1. 对于每个用户,我将创建一个新的 Job 实例,该实例具有与该用户的 ForeignKey 关系。
2. 将有一个 Job 实例,并且此 Job 实例将有一个“users”ManyToManyField 字段。
然后我将使用 Celery 处理 Job 实例,例如,对于上述第一种方式,我可以在每次运行定期任务时处理一个 Job 实例。但是..每个批量请求系列都会有大量的数据库对象......
它们对我来说似乎都很糟糕,因为它们都是大负载的操作。我错了吗?我想应该有更方便的方法。您能否建议我一个更好的方法,或者我的方法足以实施?
解决方案
您可以向您的用户模型添加一个字段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
这样您就不必设置复杂的作业队列/表
推荐阅读
- jquery - 更改属性 Django 内联表单集的值
- firebase - 具有特定 uid 的 Firebase 函数 Typescript initializeAdmin()
- javascript - 更改水平滚动条的宽度。自定义滚动条?
- java - 给定 base 和 n 都为 1 或更大,递归(无循环)计算 base 的 n 次方的值,因此 powerN(3, 2) 为 9(3 的平方)。在java中
- mysql - 在插入时禁用 innodb_log_file 写入,AWS
- javascript - D3 奇怪地附加 tbody 每隔一个渲染
- google-maps - InfoWindow“在 Google 地图上查看”链接
- aws-lambda - 使用 Amplify 为 AppSync 自动化 Lambda 解析器?
- go - 将在所有其他处理程序之前运行的中间件
- swift - 来自 URL NSString 的数据作为 NSInteger 代替