Что такое хороший дизайн для кэширования результатов дорогого поиска в системе ASP.NET?
Любые идеи приветствуются... особенно те, которые не требуют изобретения сложной инфраструктуры.
Вот некоторые общие требования, связанные с проблемой:
- Каждый результат поиска может содержать от нуля до нескольких сотен записей результатов.
- Каждый поиск является относительно дорогим и требует времени для выполнения (5-15 секунд в базе данных).
- Результаты должны быть разбиты на страницы перед отображением на клиенте, чтобы избежать перегрузки информации для пользователя.
- Пользователи ожидают, что смогут сортировать, фильтровать и искать в результатах, полученных
- Пользователи ожидают, что смогут быстро переключаться между страницами в результатах поиска.
- Пользователи ожидают, что смогут выбрать несколько элементов (через флажок) на любом количестве страниц
- Пользователи ожидают относительно быстрой работы после завершения поиска
Я вижу некоторые возможные варианты того, где и как реализовать кеширование:
1. Кэш на сервере (в кеше сеанса или в приложении), используйте обратные вызовы или панели Ajax, чтобы облегчить эффективную разбивку на страницы, сортировку, фильтрацию и поиск.
- PROS: простота реализации, достойная поддержка инфраструктуры ASP.NET
- CONS: очень частый, интенсивный объем памяти на сервере, данные могут кэшироваться дольше, чем необходимо; запрещает методы балансировки нагрузки
2. Кэш на сервере (как указано выше), но с использованием сериализуемых структур, которые перемещаются из памяти через некоторый период времени, чтобы уменьшить давление памяти на сервере
- PROS: эффективное использование серверной памяти; возможность масштабирования с использованием балансировки нагрузки;
- CONS: ограниченная поддержка инфраструктуры .NET; потенциально хрупкая, когда структуры данных изменяются; добавляет дополнительную нагрузку на базу данных; значительно сложнее
3. Кэш на клиенте (с использованием JSON или сериализации XML), используйте Javascript на стороне клиента для разбивки на страницы, сортировки, фильтрации и выбора результатов.
- PROS. Пользовательский подход может приблизиться к уровням "богатого клиента"; большинство браузеров могут обрабатывать JSON/XML изначально подходящие библиотеки для манипуляции (например, jQuery).
- CONS. Первоначальный запрос может занять много времени; значительный объем памяти на клиентских машинах; потребует ручного Javascript на каком-то уровне для реализации
4. Кэш на клиенте с использованием сжатого/кодированного представления данных - вызов на сервер для декодирования при переключении страниц, сортировка, фильтрация и поиск.
- PROS: минимизированное влияние памяти на сервер; позволяет государству жить так долго, как ему это нужно; немного улучшено использование памяти на клиенте над JSON/XML
- CONS: большие наборы данных, перемещающиеся между клиентом и сервером; более низкая производительность (из-за сетевого ввода-вывода) по сравнению с чистым кэшированием на стороне клиента с использованием JSON/XML; гораздо сложнее реализовать - ограниченная поддержка .NET/браузера
5. Некоторая альтернативная схема кэширования, которую я не рассматривал...