Как агрегировать данные API? - PullRequest
2 голосов
/ 13 февраля 2010

У меня есть система, которая подключается к 2 популярным API. Мне нужно объединить данные каждого из них в единый результат, который затем можно разбить на страницы. Масштаб проекта означает, что система может в конечном итоге поддерживать десятки API.

Каждый API накладывает максимальное ограничение в 50 результатов на запрос.

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

Я использую платформу CakePHP в среде LAMP, однако думаю, что этот вопрос относится ко всем языкам программирования.

Мой подход пока заключается в том, чтобы запросить API-интерфейс поиска каждого провайдера, а затем заполнить таблицу MySQL. Исходя из этого, результаты упорядочиваются, разбиваются на страницы и т. Д. Однако меня беспокоит производительность: связь по API, синтаксический анализ, вставка и последующее чтение всего в одном исполнении.

Я что-то упустил, у кого-нибудь есть другие идеи? Я уверен, что это общая проблема со многими альтернативными решениями.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 13 февраля 2010

У меня есть сайт, который делает это с более чем 100 RSS / атомами, вот что я делаю:

  1. У меня есть список каналов и задание cron, которое повторяет их, около 5 каналов в минуту, что означает, что я перебираю все каналы каждые 20 минут или около того.
  2. Я поднимаю канал и пытаюсь вставить каждую запись в базу данных, используя URL-адрес в качестве уникального поля. Если URL-адрес существует, я не вставляю. дата ввода - это мои текущие системные часы, и она вставляется моим приложением, поскольку поля даты в rss нельзя доверять, а в некоторых случаях даже не могут быть проанализированы.
  3. для некоторых каналов, и только опытный специалист может сказать вам, какие, я также ищу дублирующие заголовки, некоторые веб-сайты изменяют URL по своим собственным причинам.
  4. элементы теперь все помещены в одну таблицу базы данных, готовые для запроса.

Еще одна мысль: если ваше приложение может добавлять новые фиды во время работы, вам действительно следует также проверить, является ли фид «новым» (то есть: не имеет предыдущих записей в БД), если это так, вы следует пометить все доступные в настоящее время ссылки как неактивные, в противном случае при добавлении канала будет блок статей из этого канала с одинаковыми датой и временем. (проще говоря: метод, который я описал, предназначен только для будущих добавлений к каналу, предыдущие статьи не будут доступны).

надеюсь, это поможет.

1 голос
/ 13 февраля 2010

Да, это распространенная проблема.

Поиск по таким вопросам, как https://stackoverflow.com/search?q=%5Bphp%5D+background+processing

Каждый, кто пытается это сделать, понимает, что обращение к другим сайтам для получения данных происходит медленно. Первые один или два кажутся быстрыми, но другие сайты ломаются (и ваше приложение ломается), а другие сайты работают медленно (а ваше приложение медленно)

Вы должны отсоединить интерфейс от сервера.

Вариант 1 - предварительно запросить данные с помощью фонового процесса, который просто получает и загружает базу данных.

Вариант 2 - запустить длительный фоновый процесс и вернуться из функции JavaScript, чтобы убедиться, что он уже сделан.

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

...