Un poco de historia: estoy trabajando en una aplicación web que requiere bastante tiempo para preparar/procesar datos antes de dárselos al usuario para que los edite/manipule. La tarea de solicitud de datos ~ 15/20 segundos para completar y un par de segundos para procesar. Una vez allí, el usuario puede manipular vaules sobre la marcha. Cualquier manipulación de valores requerirá que los datos sean reprocesados por completo.Almacenamiento de datos en memoria: sesión frente a caché frente a estático
Actualización: Para evitar confusiones, solo realizo la llamada de datos 1 vez (el hit de 15 segundos) y luego quiero mantener los resultados en la memoria para que no tenga que volver a llamar hasta que el usuario sea 100% hecho trabajando con eso Por lo tanto, la primera extracción llevará un tiempo, pero, usando Ajax, voy a golpear los datos en la memoria para actualizar constantemente y mantener el tiempo de respuesta en alrededor de 2 segundos más o menos (espero).
Para hacer esto eficiente, estoy moviendo los datos iniciales en la memoria y usando las llamadas Ajax al servidor para poder reducir el tiempo de procesamiento para manejar el recálculo que ocurre con las actualizaciones de este usuario.
Aquí está mi pregunta, con el rendimiento en mente, ¿cuál sería la mejor manera de almacenar estos datos, suponiendo que solo 1 usuario estará trabajando con estos datos en un momento dado.
Además, el usuario podría estar trabajando en este proceso durante unas horas. Cuando el usuario esté trabajando con los datos, necesitaré algún tipo de protección contra fallas para guardar los datos actuales del usuario (ya sea en un DB o en un archivo binario serializado) si su sesión se interrumpe de alguna manera. En otras palabras, necesitaré una solución que tenga un enlace apropiado que me permita volcar los datos del objeto de memoria en caso de que el usuario se desconecte/distraiga por mucho tiempo.
Hasta ahora, aquí están mis reflexiones:
estado de sesión - Pros: Cerrado a un usuario. Tiene el evento de fin de sesión que cumplirá mis requisitos de seguridad. Contras: Perforación más lenta de mis opciones actuales. El evento Session End es a veces complicado para garantizar que se active correctamente.
Almacenamiento en caché - Pros: Good Perf. Tiene acceso a dependencias que podrían ser una ventaja más adelante pero no son realmente útiles en el alcance actual. Contras: No es un paso fácil a prueba de fallas que no sea una escritura basada en intervalos de tiempo. Alcance global: deberá garantizar que los usuarios no choquen entre ellos.
Estático - Pros: Mejor Perf. Es fácil de mantener ya que puedo aprovechar directamente mis estructuras de clase actuales. Contras: No es un paso fácil a prueba de fallas que no sea una escritura basada en intervalos de tiempo. Alcance global: deberá garantizar que los usuarios no choquen entre ellos.
¿Alguien tiene alguna sugerencia/comentario sobre qué opción debo elegir?
Gracias!
Actualización: Olvidé mencionar que estoy usando VB.Net, Asp.Net y Sql Server 2005 para realizar esta tarea.
Por lo general, es más barato actualizar su servidor que perder tiempo optimizando su código. Creo que Jeff Atwood dijo algo al respecto en su blog últimamente. – Malfist
Supongo que debería haber sido más específico con el rendimiento. No me preocupa tanto el hecho de que el servidor maneje el uso de la memoria, sino más bien, cuánto tiempo llevará volver mi respuesta al usuario. – Nathan
¿Qué idioma/tecnología estás usando? – nlaq