Шаблон для периодического получения данных из внешней системы

Предположим, у меня есть приложение Django со следующими возможностями:

  • есть модель Project, в которой есть поле created_at
  • приложение поддерживает систему плагинов, где разработчик может создавать пользовательские конечные точки API и устанавливать их в приложение, выставляя их на всеобщее обозрение. Конечные точки могут выполнять произвольный код, но не могут планировать долго выполняющиеся задачи (например, задачи Celery)
  • .

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

Первый шаг - это создание плагина, который будет выступать в роли "адаптера", выставляющего конечную точку API, которая представляет проекты в формате, удобном для аналитического сервиса. Мы имеем полный контроль над этой конечной точкой, над тем, какие параметры она принимает и т.д. Предположим, что он отвечает с помощью пагинации.

Теперь вопрос: если предположить, что служба аналитики будет выполнять один запрос в час для получения новых проектов, то каким должен быть шаблон, чтобы запрашивать только новые проекты?

Есть две техники, о которых я думал, обе со своими преимуществами и недостатками.

  • Используйте параметр запроса since, указывающий временную метку последнего получения проекта службой аналитики. Приложение аналитики запустится в цикле, чтобы получить все страницы из конечной точки адаптера, а затем сохранит текущее время в качестве последней временной метки. Плюс в том, что это очень простой подход. Основным недостатком является то, что любые проекты, созданные во время получения страниц, могут никогда не попасть в аналитику

    .
  • Указывать в теле запроса/параметрах запроса список идентификаторов проектов, которые аналитика уже получила. Это предотвращает голодание, но в конечном счете приведет к тому, что запросы будут огромными.

Есть ли лучший способ?

Вернуться на верх