Особенности архитектуры и кэширования с большими файлами XML

Я создаю веб-сайт для отображения продуктов и категорий продуктов. Данные поступают из внешней службы в виде файла XML размером 500 тыс. Сайт ASP.NET, C #.

XML структурирован как список категорий. Внутри каждой категории может быть несколько продуктов и / или несколько других категорий.

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

  • Отобразить меню категории продуктов в левой части страницы
  • Показать все товары в выбранной категории
  • Показать расширенную информацию об одном продукте

Мой вопрос (ы) заключаются в следующем:

Во-первых, на странице, которая отображает все продукты в категории «DVD», скажем, я делаю следующее (при загрузке страницы):

XDocument allCategories = Cache["CategoriesXml"];
// loop through the XML and find the DVD category
// Get all products under it, then display them

Принося категории XML в локальную переменную (помните, это 500 КБ), это истощает сервер? Помните, мне придется делать это каждый раз, когда страница загружается. Там могут быть тысячи людей, смотрящих на разные страницы одновременно. Если тысячи людей загрузят одну и ту же страницу в течение нескольких секунд, у меня будет тысяча экземпляров этого XML-файла, который висит в памяти? Или сборщик мусора справится со всем этим для меня?

Лучше ли зацикливаться непосредственно на кэшированном элементе, или это менее производительно (и / или плохая практика)?

Во-вторых, я сказал, что кэширую весь XML-файл. Я получаю продукты или категории из этого XML, просматривая его (я использую LINQ поверх XML). Было бы лучше создать тип категории и тип продукта, поместить их в массивы и кэшировать их? Затем цикл по объектам и массивам категорий, а не XDocument? Что будет более производительным?

В-третьих, что бы вы сказали, это лучшая практика с точки зрения архитектуры этой системы. Допустим, у меня есть уровень доступа к данным, уровень бизнес-объектов и веб-приложение. Где я должен поместить ссылку на внешний сервис, чтобы получить XML? Какой слой я должен кэшировать это? Есть ли у этого приложения даже уровень доступа к данным, в том смысле, что часть DAL выполняется какой-то другой системой? В настоящее время мой DAL предназначен только для доступа к нашей базе данных, и неправильно помещать туда ссылку на веб-сервис, но, возможно, это не так? Является ли плохой практикой использование кэширования на бизнес-уровне (т.е. мешает юнит-тестам и т. Д.)? Я рассмотрел промежуточный уровень между сетью и бизнес-уровнем, предназначенный исключительно для кэширования - это хорошая или плохая идея?

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

Спасибо!

13.12.2008 21:36:45
Хотите ответить на свой вопрос в ретроспективе? :) Какое решение сработало для вас лучше всего?
Nikita B 3.12.2015 07:03:44
1 ОТВЕТ

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

Я не знаком с ASP.NET, но я предполагаю, что да, каждый запрос страницы приведет к загрузке файла XMl отдельно.

И я бы не стал хранить XML в памяти. Вы должны хранить нужные данные в памяти. Вероятно, существуют библиотеки ASP.NET для использования кэшей в памяти, таких как Memcached, где вы можете хранить сериализованные версии объектов.

3
14.12.2008 01:05:20
+1. Вы даже можете добавить еще один уровень абстракции и сделать кеширование проходом в кеш, который я видел. Преимущество заключается в том, что сквозное кэширование может быть написано для использования с несколькими DAL (для нескольких приложений).
Joseph Ferris 14.12.2008 16:10:24
@ Джозеф: что вы подразумеваете под «сделать кеширование проходом в кеш» - вы можете объяснить это на примере?
Alex York 14.12.2008 17:27:38