Я создаю веб-сайт для отображения продуктов и категорий продуктов. Данные поступают из внешней службы в виде файла 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 предназначен только для доступа к нашей базе данных, и неправильно помещать туда ссылку на веб-сервис, но, возможно, это не так? Является ли плохой практикой использование кеширования на бизнес-уровне (т. Е. Мешает юнит-тестам и т. Д.)? Я рассмотрел промежуточный уровень между сетью и бизнес-уровнем, предназначенный исключительно для кэширования - это хорошая или плохая идея?
Я уже закончил большую часть этого веб-сайта - я просто сейчас оглядываюсь на него и задаюсь вопросом, сделал ли я это наилучшим образом, поэтому хочу сравнить ваши предложения с тем, что я на самом деле сделал, и, надеюсь, Я смогу вернуться и улучшить его.
Спасибо!