Muchas aplicaciones hacen uso del objeto session para almacenar datos de las sesiones que mantienen con un usuario o instancia de explorador. Este mecanismo les permite mantener datos entre las distintas peticiones de las páginas y recursos en general del sistema y de esta forma compartir información o almacenarla para no tener que consultarla sucesivamente y obtenerla cada vez que se requiera.

La utilización de este tipo de mecanismos tiene algunas; la primera de ellas es que el sitio estará dependiendo del estado en el que se encuentre; o sea, que no será stateless. Con esto queremos decir que dada una página o recurso x que haga uso de la sesión puede tener dependencias con que otra página o recurso allá dejado datos en dicho objeto para posteriormente obtenerlo. Si no utilizamos correctamente este objeto podemos estar creando dependencias entre recursos de nuestro sistema que no necesariamente tienen que existir y estaríamos limitando la utilización del mismo.

Otra desventaja que encontramos si no lo utilizamos correctamente es que el sistema está impidiendo la escalabilidad horizontal del mismo debido a que por defecto los datos de la sesión se guardan dentro del servidor de la aplicación. Mientras la aplicación se encuentre desplegada en un solo servidor no vamos a tener inconvenientes con este tipo de mecanismos, pero al desplegarlo en varios buscando escalar la aplicación horizontalmente no vamos a encontrar con un problema. Este fenómeno produce que, si tenemos 3 servidores para resolver las peticiones que le realicen a nuestro sistema, al gestionar por primera vez un recurso tal como una página responde el servidor A, mientras que la segunda vez que realicemos una petición puede responder el servidor B y el mismo no tener acceso a los datos de sesión que guardo el A en su mismo servidor.

session

Descripción de los pasos:

  1. El usuario realiza la petición de un recursos a nuestro sistema.
  2. La petición es atendida por el servidor A y dentro del procesamiento de esa petición almacena datos en el objeto session configurado por defecto.
  3. El servidor A devuelve el recurso solicitado por el usuario.
  4. El usuario realiza una nueva petición al sistema basado en la respuesta anterior.
  5. La petición es atendida por el servidor B y el procesamiento requiere los datos almacenados por la petición anterior. Al buscar los datos en el objeto session no los encuentra debido a que los mismos se encuentran almacenados localmente en el servidor A. Por tal motivo produce un error y no puede procesar la petición.
  6. El servidor B devuelve un error al usuario debido a que no cuenta con los datos suficientes para procesar la petición.

Como consecuencia de este escenario nuestro sistema sólo admite ejecutarse en un servidor para obtener un funcionamiento correcto.

Para evitar este tipo de conflicto debemos almacenar los datos de la sesión en un almacenamiento que sea accesible desde cualquier servidor y que permita que todos lo acedan al mismo tiempo pudiendo obtener los recursos necesarios.

Cuando estamos pensando en hacer un sistema bajo la plataforma de Windows Azure estamos pensando en que nuestro sistema debe ser escalable para poder abastecer la demanda que se presente en cada momento y no estar nunca con los recursos por debajo de los necesarios para procesar las peticiones. Por tales motivos la utilización del objeto session deben ser previamente analizados para no generar este tipo de problemas.

Para poder habilitar la utilización del objeto session dentro de Windows Azure debemos realizar los siguientes pasos.

Imagen1

  • Una vez configurado debemos crear las estructuras de datos necesarias en SQL para poder almacenar los datos. Para lo cual deben ejecutarse los scripts que se encuentran en este link.
  • Ahora solo nos falta realizar un proceso para eliminar las sesiones que se encuentren expiradas. Para realizar este procesamiento podemos crear un worker role que cada cierto lapso de tiempo realice esta tarea.

image

De esta forma podemos utilizar el objeto session dentro de nuestros sistemas en Azure sin ningún problema. En este ejemplo la sesión esta siendo almacenada en SQL Azure. Dentro del trining Kit de Azure viene un ejemplo de como hacer para que se almacenen los datos en el table storage de Azure (ASPProviders).