Лучший способ отправки массовых запросов на удаленный API с Django Celery? - PullRequest
1 голос
/ 23 марта 2020

У меня есть таблица пользователей с 24K пользователями на моем Django веб-сайте, и мне нужно получить информацию для каждого из моих пользователей, отправив запрос на удаленную конечную точку API, скорость которой ограничена (15 запросов / минуту).

Так что я планирую использовать задачи Celery periodi c с новой моделью под названием «Работа». С моей точки зрения, существует два способа:
1. Для каждого пользователя я создам новый экземпляр Job с отношением ForeignKey к этому пользователю.
2. Будет один экземпляр Job, и этот экземпляр Job будет иметь "users" Поле ManyToManyField для него.

Затем я обработаю экземпляры заданий с помощью Celery, например, я могу обработать один экземпляр задания при каждом запуске задачи periodi c для первого способа выше , Но ... для каждой серии массовых запросов будет огромное количество дБ-объектов ...

Оба они кажутся мне плохими, поскольку они работают с большими нагрузками. Я ошибаюсь? Я думаю, что должен быть более удобный способ сделать это. Можете ли вы предложить мне лучший способ, или мои пути достаточно хороши для реализации?

1 Ответ

1 голос
/ 23 марта 2020

Вы можете добавить поле к вашей модели пользователя 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

Таким образом, вы бы не стали необходимо настроить сложную очередь заданий / таблицу

...