¿Qué es un buen diseño para almacenar en caché los resultados de una búsqueda costosa en un sistema ASP.NET?Arquitectura de almacenamiento en caché para resultados de búsqueda en una aplicación ASP.NET
Cualquier idea sería bienvenida ... especialmente aquellas que no requieren inventar una infraestructura compleja propia.
Éstos son algunos de los requisitos generales relacionados con el problema:
- cada resultado de búsqueda puede producir incluir de cero a varios cientos de registros de resultados
- Cada búsqueda es relativamente caro y requiere mucho tiempo para ejecutar (5-15 segundos en la base de datos)
- Los resultados se deben paginar antes de mostrarse en el cliente para evitar la sobrecarga de información para el usuario
- Los usuarios esperan poder ordenar, filtrar y buscar dentro de los resultados devueltos
- Los usuarios esperan a ser capaz de cambiar rápidamente entre páginas en los resultados de búsqueda
- Los usuarios esperan para ser capaz de seleccionar varios elementos (a través de la casilla de verificación) en cualquier número de páginas
- Usuarios esperar un rendimiento relativamente rápido una vez a la búsqueda tiene terminé
veo algunas posibles opciones para dónde y cómo implementar el almacenamiento en caché:
1. caché en el servidor (en sesión o caché de la aplicación), utilizar las devoluciones de datos o paneles de Ajax para facilitar la paginación eficiente, clasificación , filteri ng y buscando.
- PROS: Fácil de implementar, apoyar decente desde la infraestructura ASP.NET
- CONS: Muy hablador, que requieren mucha memoria en el servidor, los datos se pueden almacenar en caché más de lo necesario; prohíbe las prácticas de balanceo de carga
2. caché en el servidor (como el anterior) pero utilizando estructuras serializeable que se mueven fuera de la memoria después de un periodo de tiempo para reducir la presión de memoria en el servidor
- PROS: Uso eficiente de la memoria del servidor; capacidad de escalar utilizando equilibrio de carga;
- CONS: Soporte limitado de la infraestructura .NET; potencialmente frágil cuando las estructuras de datos cambian; coloca carga adicional en la base de datos; significativamente más complicado
3. caché en el cliente (utilizando la serialización JSON o XML), el uso del lado del cliente Javascript para paginar, ordenar, filtrar y seleccionar resultados.
- PROS: La experiencia del usuario puede acercarse a los niveles de "cliente enriquecido"; la mayoría de los navegadores pueden manejar JSON/XML de forma nativa: existen bibliotecas decentes para la manipulación (por ejemplo, jQuery)
- CONS: la solicitud inicial puede tardar mucho tiempo en descargarse; huella de memoria significativa en las máquinas del cliente; requerirá Javascript hechos a mano en un cierto nivel para implementar
4. caché en el cliente utilizando una representación comprimida/codificado de los datos - llamar de nuevo en el servidor para decodificar cuando se cambia de páginas, ordenar, filtrar y buscar .
- PROS: Impacto Máximo ahorro de memoria en el servidor; permite que el estado viva mientras el cliente lo necesite; uso de memoria ligeramente mejorado en el cliente a través de JSON/XML
- CONS: grandes conjuntos de datos que se mueven hacia adelante y hacia atrás entre el cliente/servidor; un rendimiento más lento (debido a la E/S de red) en comparación con el almacenamiento en caché puro del lado del cliente utilizando JSON/XML; mucho más complicado de implementar - un apoyo limitado de .NET/navegador
5. Algunos esquema de caché alternativa no he considerado ...
Una sugerencia: hacer algunas google en su título de "almacenamiento en caché de resultados de la búsqueda" original. Mirar SOLAMENTE al almacenamiento en caché en su escenario ES hacer el suyo propio. Estado allí, hecho eso; y es difícil con la búsqueda. Sólo digo. – jro
5-15 segundos es un largo tiempo en términos de consultas DB. Tal vez deberías enfocarte al menos en un esfuerzo para mejorar las consultas DB (usa "uniones internas" en lugar de "uniones externas", usa "uniones internas" en lugar de filtros "dónde"). También considere usar la indización de texto completo. –