#.net #xml #caching
#.net #xml #кэширование
Вопрос:
Вот справочная информация, у меня есть веб-сервис от поставщика / партнера, который возвращает большой XML-документ, который я использую для отображения данных. Достаточно просто. Проблема в том, что выполнение службы занимает несколько минут. Поставщик возвращает всю нормализованную базу данных в виде XML-документа за один вызов метода, и это происходит медленно. Глупый поставщик, но я не могу это контролировать.
У меня два вопроса:
-
Где мне его кэшировать? Диск, база данных, память (я склоняюсь к размещению его на диске. Он слишком большой, и к нему недостаточно доступа для хранения в памяти. Вероятно, правильно поместить его в базу данных, но я не хочу писать ETL и где-то запускать задание.)
-
Как мне его кэшировать? Я не могу просто дать ему истечь и попросить следующий запрос обновить кеш, потому что это занимает так много времени. Мне нужно обслуживать устаревшие данные во время восстановления кэша. Я могу придумать пару способов сделать это, но ничего такого, что казалось бы простым или очень элегантным. Я хочу сделать что-то простое; я не ищу лучшее инженерное решение когда-либо.
Вот мой план … пожалуйста, скажите мне, что я идиот, и предложите что-нибудь попроще, что я упускаю из виду.
- Запишите XML на диск
- В то же время запишите имя файла и какой-нибудь тип бомбы истечения срока действия в кэш (очевидно, что срок действия имени файла не истечет в течение очень долгого времени)
- В моем рабочем потоке попробуйте прочитать мою бомбу из кэша
- Если срок действия кэша истек (моя бомба сработала), то создайте поток для получения и сохранения XML
- тем временем возьмите имя файла из кэша и прочитайте старый XML, пока создается новый
- когда новый набор данных будет завершен, истечет срок действия старого имени файла из кэша и запишите имя файла в кэш
Для меня это звучит довольно нелепо, и должен быть способ получше.
Я использую .Net и IIS6, и я могу вставить XML в SQL Server, если это необходимо.
Комментарии:
1. Почему вы не можете сохранить эти данные в памяти? Какого размера объект, который вы хотите сохранить?
2. Почему вы не можете просто увеличить время ожидания соединения для iis, чтобы у вас было достаточно времени для загрузки всего файла? Насколько велик этот файл в любом случае?!
3. Размер объекта составляет несколько МБ, который, я согласен, невелик, но к нему также обращаются недостаточно часто, чтобы я захотел кэшировать его в памяти. Я рассматривал возможность просто принять удар, и я все еще могу пойти в этом направлении. Я изменил время ожидания, но я не могу допустить, чтобы пользователь ждал 90 секунд отображения данных, поэтому мне нужно что-то предоставить пользователю, пока кэш восстанавливается.
Ответ №1:
Вы могли бы создать новую базу данных и запланированное задание для периодического извлечения этих данных и сохранения их в базе данных. Затем вы можете передавать данные, которые действительно необходимы, непосредственно из вашей базы данных вместо веб-службы.
Комментарии:
1. Я рассматривал возможность этого, но задание SQL — это еще одна ошибка, с которой не нужно справляться, а добавление другой базы данных — еще один объект для обслуживания. Эти данные размещались внутри компании еще год назад. Одной из причин выбора поставщика было то, что не нужно было поддерживать данные внутри компании или создавать интерфейсы для управления данными. Все, что мы хотим сделать, это отобразить данные.
2. Еще одна быстрая вещь: если я вставляю его в SQL, я вставляю весь объект в SQL. Я не собираюсь приводить его к нормализованному виду. В этом проекте у меня очень мало времени или ресурсов. Я все закончил, кроме кэширования, и я не хочу тратить время на перестройку моего уровня доступа к данным. Я не пытаюсь быть ленивым, скорее я пытаюсь быть прагматичным.
3. @Jay, не могли бы вы, пожалуйста, рассказать нам немного больше об этом объекте? Вы сказали, что размер этого объекта составляет несколько МБ? Вам нужно отобразить весь объект в представлении или вам просто нужно отобразить некоторую часть этого объекта? 90 секунд для отображения данных — это слишком много.
4. Конечно, объект по сути представляет собой нормализованную базу данных, сериализованную в XML и обслуживаемую через веб-службу. Модель данных будет представлять собой основную таблицу с несколькими связями по внешнему ключу с другими таблицами, некоторые из которых имеют свои собственные связи по внешнему ключу. Уровень вложенности, возможно, 4-5 в глубину. Честно говоря, это не лучший веб-сервис (не лучший поставщик). Мне не нужны все данные сразу, но нет полезного способа извлечь только то, что мне нужно. Методы, возвращающие подмножества данных, не учитывают важные поля или требуют выполнения вызовов в циклах. Одним из примеров этого является возврат списка контактов.
5. Извините, что вынужден продолжить… В любом случае, я могу получить отфильтрованный список контактов, но я не получаю метаданные вместе со списком, поэтому мне приходится совершать последующие вызовы, чтобы получить связанные метаданные для этого контакта. Честно говоря, это дерьмовый сервис, вероятно, расположенный в неправильно спроектированной базе данных. Я не уверен, почему служба так медленно возвращает базовый объект, но это так. В лучшем случае это 45 секунд, а в худшем — почти две минуты. Как только я получаю объект от них и работаю с локальной копией на диске или в БД, он вылетает (отсюда мой вопрос о том, как кэшировать эту вещь).