2010-08-10 5 views
2

У меня есть XML-канал, который содержит 1000+ записей о свойствах (аренда, продажа).Каков наилучший способ кэширования XML-фидов на местном уровне?

В настоящее время я звоню этот канал 16x на домашней странице, всегда возвращая только 3 свойства для конкретных критериев, как 3 новый дом, 3-х новых квартир и т.д., 5 рекомендуется дом, 5 рекомендуемые квартир и т.д.

Этот сценарий работает хорошо в течение 7 месяцев, тогда как было 200+ свойств и только 100-200 просмотров в день. Теперь он становится на сцене, где у меня есть более 700 посещений в день и более 1000+ свойств и загрузка 16 каналов отдельно, чтобы показать главную страницу, становится все медленнее, а трафик становится все больше.

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

У меня нет проблем с загрузкой XML локально и локально файлов вызовов для отображения данных. Но я хотел бы знать, как решить возможные проблемы, как:

  • не показывают данные клиентов, потому что робот обновляет XML-файлы и исходный файл будет перезаписан и пустыми во время загрузки новых данных
  • с использованием XML-файл как локальные резервное копирование, означает, что если исходный сервер отключился домашним будет еще работать и загрузка
  • , убедившись, что я не буду блокировки данных для клиентов таким образом, что робот не сможет обновлять файлы

Моих первыми toughts бы для работы с 2 xml-файлами для eve который будет показан клиентам, и тот, который будет загружен. Если загрузка правильная, то загруженный XML будет использоваться в качестве живых данных, а другой - удален. Некоторая инкрементная маркировка одним файлом, работающим как файл, хранящий имя фактических данных.

Есть ли способ кэшировать эти XML-файлы, чтобы он делал что-то подобное? На самом деле основная проблема заключается в том, чтобы иметь пуленепробиваемое решение, чтобы клиенты не видели страницы ошибок или пустые результаты.

Спасибо.

ответ

1

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

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

Если вам нужно управлять собственным кешем XML-потоков, тогда нормальная блокировка файлов и, если это действительно необходимо, .NET ReaderWriterLockSlims должно быть достаточным, чтобы разные потоки не перепутали друг друга. Одна из возможностей устранить риск конкуренции, которая слишком высока, - это по умолчанию прямой доступ в случае конфликта кеша. Подумайте, что кеширование - это в конечном счете оптимизация (концептуально вы получаете файл «с сервера», кеширование делает это более эффективным образом). Следовательно, если вам не удается быстро получить блокировку чтения, вы можете вернуться к загрузке напрямую. Это, в свою очередь, уменьшает ожидания, которые могут произойти для блокировки записи (поскольку ожидающие блокировки не будут складываться со временем при запросе блокировки записи).На практике это, скорее всего, произойдет не очень часто, но это избавит вас от риска недопустимого раздумирования вокруг одного файла и сведя всю систему вниз.

+0

О, я должен добавить - как это может быть уместно здесь - что еще один вариант при работе с обычным кешем - добавить приемлемую степень застоя, например. («дайте мне это, если он свежий, или если вы обычно считаете его устаревшим, но устаревшим менее чем за 4 часа»). –

+0

Можно ли проверить фактический размер или статус файла, а если кеш/синхронизация - только если он отличается? – feronovak

+0

Это было бы, хотя вам придется идти дальше, поскольку изменения могут (и в реальной жизни, часто это делают) приводить к файлам одинакового размера. Вы можете сохранить и MD5 файла или E-тег, который получил WebResponse (это последнее лучше, если отправляются теги E, если не ругать человека, который работает с веб-сайтом, если это возможно, до тех пор, пока они не будут) или последним -mod date в веб-ответе (если в этой системе невозможно внести изменения в подсекунду). Опять же, проверка last-mod и etags происходит автоматически с соответствующим использованием кэша веб-памяти, встроенного в HttpWebResponse, когда вы используете соответствующие параметры. –

0

Я собираюсь начать с предположения, что у вас нет собственного кода, который создает исходный XML-канал? Потому что, если вы это сделаете, я бы посмотрел на добавление определенной поддержки для запросов, которые вы хотите запустить.

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

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

Тогда я бы посмотрел на простой сервисный уровень, чтобы выставить данные в вашем местном магазине.

+0

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

+0

Нет У меня нет доступа к исходному коду подачи XML. У меня есть структура и нужно работать с этим. Я думаю о кешировании каждые 5 минут, так как есть довольно большие колебания данных. – feronovak

Смежные вопросы