Не могу определить хороший способ обработки данных кэширования с внешнего сайта в Rails

Таким образом, основные данные моего приложения (rails) зависят от данных с внешнего сайта. Но я немного не понимаю, как мне справиться с тем, чтобы не запрашивать данные на внешнем сайте повторно, и нужно ли мне переводить данные в локально сохраняемые объекты. Я знаю, что и Rails, и ActiveRecord предоставляют способы кэширования.

По сути, я получаю информацию о курсе Classroom в виде массива хэшей, каждый из которых представляет объект курса. Кроме того, каждый объект курса сохраняет URI для получения информации об этом конкретном курсе из внешней службы REST.

В настоящее время я рассматриваю что-то вроде:

  • сопоставление внешних данных с объектом, который сохраняется в моей локальной базе данных
  • использование кэширования с помощью Rails и установка даты истечения срока действия.
  • Обновление (неопределенно): при извлечении записи из кеша Rails, если срок ее действия истек, каким-либо образом настройте ее для извлечения этого курса из внешнего источника с использованием URI, предоставленного внешним сайтом. Может это служба?

Есть предложения по вышеизложенному?


person pghtech    schedule 20.01.2013    source источник


Ответы (1)


С первым вариантом — отображением внешних данных в вашу собственную модель, которая сохраняется в вашей БД — это нормально, если у вас есть разумный способ синхронизации данных.

Я использовал sidekiq с некоторыми работниками, чтобы постоянно опрашивать изменения и обновлять свои локальные записи. Лучше, если внешняя служба каким-то образом сообщает об изменении своих данных (например, публикует в такой службе, как Superfeedr, или предоставление некоторых каналов с метаданными о других каналах), вместо того, чтобы заставлять клиентов извлекать данные и проверять наличие изменений. В любом случае вам все равно нужно будет обновить то, что изменилось, и управление этим с помощью фонового работника, вероятно, будет правильным решением.

person Josh Rieken    schedule 20.01.2013
comment
С фоновым рабочим процессом, как вы предположили, это было бы похоже на использование чего-то вроде cron для доступа к сайту, чтобы запустить процесс внесения обновлений, когда это необходимо? - person pghtech; 21.01.2013
comment
Sidekiq имеет встроенное планирование, поэтому у вас может быть рабочий, которого вы запускаете, который перепланирует себя, чтобы снова запуститься через 5 минут или любой другой интервал, который вы хотите, используя perform_at(5.minutes.from_now). Sidekiq worker — это просто класс, который включает в себя Sidekiq::Worker и реализует метод perform, который делает все, что вы хотите. Он очень легко интегрируется с Rails. Ознакомьтесь с документацией: github.com/mperham/sidekiq/wiki/Getting-Started - person Josh Rieken; 21.01.2013
comment
Таким образом, нет необходимости в cron или чем-то еще, кроме Rails. - person Josh Rieken; 21.01.2013