Шаблон для периодического получения данных из внешней системы
Предположим, у меня есть приложение Django со следующими возможностями:
- есть модель Project, в которой есть поле
created_at
- приложение поддерживает систему плагинов, где разработчик может создавать пользовательские конечные точки API и устанавливать их в приложение, выставляя их на всеобщее обозрение. Конечные точки могут выполнять произвольный код, но не могут планировать долго выполняющиеся задачи (например, задачи Celery) .
Моя цель - создать сторонний аналитический сервис для этого приложения. Для этого аналитический сервис должен периодически опрашивать приложение на предмет новых данных. В частности, аналитическому приложению необходимо получать все новые проекты.
Первый шаг - это создание плагина, который будет выступать в роли "адаптера", выставляющего конечную точку API, которая представляет проекты в формате, удобном для аналитического сервиса. Мы имеем полный контроль над этой конечной точкой, над тем, какие параметры она принимает и т.д. Предположим, что он отвечает с помощью пагинации.
Теперь вопрос: если предположить, что служба аналитики будет выполнять один запрос в час для получения новых проектов, то каким должен быть шаблон, чтобы запрашивать только новые проекты?
Есть две техники, о которых я думал, обе со своими преимуществами и недостатками.
Используйте параметр запроса
.since
, указывающий временную метку последнего получения проекта службой аналитики. Приложение аналитики запустится в цикле, чтобы получить все страницы из конечной точки адаптера, а затем сохранит текущее время в качестве последней временной метки. Плюс в том, что это очень простой подход. Основным недостатком является то, что любые проекты, созданные во время получения страниц, могут никогда не попасть в аналитикуУказывать в теле запроса/параметрах запроса список идентификаторов проектов, которые аналитика уже получила. Это предотвращает голодание, но в конечном счете приведет к тому, что запросы будут огромными.
Есть ли лучший способ?