Кэширование при использовании веб-сервиса - PullRequest
1 голос
/ 22 марта 2011

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

Теперь то, что я делал в прошлом, - просто сохраняю атрибуты службы погоды в таблице и время от времени обновляю данные. Например, служба погоды может выглядеть так:

Weather for 90210 (example primary key)
-----------------------------
Zip Name: Beverly Hills
Current Temperature: 90
Last Temp: 89
Humidity: 0
... etc.

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

Этот простой подход работает хорошо, за исключением случаев, когда веб-сервис имеет большой список атрибутов (скажем, 1000). Сейчас я трачу много времени на создание и обслуживание столбцов БД, повторяя уже существующие атрибуты других пользователей. Было бы здорово, если бы я мог просто кэшировать весь ответ и обращаться к нему как к простому хэшу, когда мне это нужно. Тогда у меня будут кешированы все атрибуты, которые веб-сервис предлагает «бесплатно», потому что все возможности веб-сервиса будут в моем хэше, а не просто будут кэшировать подмножество.

Чтобы сделать это, я мог бы получить ответ веб-службы, сериализовать его (возможно, YAML), а затем получить сериализованный объект, если он существует. Мех, не отлично. Сериализация может стать странной со специальными символами. Было бы здорово, если бы я мог просто следовать модели типа memcached, но я не думаю, что вы можете хранить сложные объекты в memcached, верно? Я также хотел бы ограничить количество представляемого программного обеспечения, чтобы автономный уровень прокси был бы неоптимальным для меня.

Кто-нибудь сделал что-то подобное или есть имя для этого?

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Если API, который вы используете, является RESTful и учитывает кеширование, не изобретайте колесо заново.В HTTP встроено кэширование (см. RFC 2616), поэтому постарайтесь использовать его как можно дальше.У вас есть два варианта:

  1. Просто вставьте прокси-сервер squid между вашим приложением и API, и все готово.
  2. Используйте Wrest - мы написали этоподдерживает кэширование HTTP 2616, и это единственная из известных мне оболочек Ruby HTTP.

Если API не учитывает кэширование (большинство так и делают), то другой совет, который вы получили, имеет смысл.То, что вы на самом деле используете для хранения кеша (mongodb / memcached / что угодно), зависит от множества других факторов, так что в действительности это зависит от вашей ситуации.

1 голос
/ 22 марта 2011

Вы можете использовать MongoDB (или другое хранилище данных JSON) и получить результаты API в JSON, сохранить результаты в своей коллекции mongo. Затем получите данные и атрибуты, которые вас интересуют, и проигнорируйте все остальные.

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

Это будет модификация шаблона Rails.cache.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...