Cómo funciona Session Stickiness en un Load Balancer (ALB) en AWS


Hoy ganaremos algo de experiencia con las session stickiness cuando trabajan con un Load Balancer.
Importante mencionar que esta feature permite mantener sesiones de usuarios cuando tenemos aplicaciones que son stateful, como por ejemplo en el comercio electrónico. En este caso, se crea una cookie que se nos asigna durante 7 días. Esta cookie está asociada a una misma instancia.
La infraestructura que tengo preparada consiste en una VPC, con 3 subnets públicas que están asociadas a un Auto Scaling Group (ASG) configurado con un configuration template. Tengo definido un total de 6 instancias (desired).
Además, tengo un Load Balancer con nodos en cada una de las subnets (mencionar que estos son Internet-facing).
Paso 1: Sin stickiness
Primero trataremos de conectarnos a la aplicación con la opción de session stickiness desactivada.
En este caso, las conexiones se distribuirán entre todas las instancias. Cada una tiene una probabilidad del 16,66% de recibir una conexión.
Paso 2: Con stickiness
Ahora nos conectaremos al Load Balancer pero con la opción de session stickiness activada, donde la cookie será generada y enviada al navegador.
Esta cookie se asocia a una instancia en particular (de las 6 disponibles), y se mantendrá durante 7 días o hasta que la sesión termine (por fallo de la instancia o si el cliente elimina la cookie).
Toda la infraestructura fue levantada mediante CloudFormation.
Validación de las instancias
Revisaremos primero que las instancias estén corriendo.
Tenemos un total de 6 instancias. Seleccionaremos algunas y me conectaré a través del DNS asociado a cada una.
Como podemos ver, cada instancia tiene su propio Instance ID, un color distinto y una imagen distinta.
Revisión del Load Balancer
Ahora iremos al apartado del Load Balancer.
Tendremos el ALB ya creado y copiaremos el registro A (DNS) creado, con el cual accederemos y se nos balanceará entre las 6 instancias.
El ALB me envió a una instancia, pero si vuelvo a recargar, veremos qué sucede.
Me dirige hacia otra instancia. Como mencioné antes, esto puede ser un problema cuando la aplicación es stateful, ya que podría ocurrir que, si agrego algo a mi carrito y actualizo la página, mi carrito vuelva a estar vacío (por ejemplo).
Activación del session stickiness
Ahora activaremos el session stickiness en el Load Balancer.
Esto se aplica en el Target Group, que es donde el ASG provisiona las instancias.
Iremos a Atributos > Editar.
En "Target Selection", habilitamos la opción Stickiness - Load Balancer generated cookie, y definimos una duración de la sesión de 2 minutos para realizar la prueba. Guardamos los cambios.
Ahora cargaremos nuevamente la dirección DNS del Load Balancer y veremos a qué instancia nos asocia.
Si recargo la página, se mantiene la misma instancia, gracias a la cookie de sesión. Podemos ir más allá y revisar el paquete a través de Wireshark.
Como podemos ver, se me asigna la siguiente cookie.
Ahora realizaremos lo siguiente: recordar los primeros dígitos de la cookie, ya que terminaré la instancia asociada a mi sesión. Entonces, mi sesión debería terminar y se me debería asignar una nueva cookie con una nueva instancia.
Me aparece un error al principio, ya que terminé la instancia.
Si recargo nuevamente, podemos ver que se me asigna una nueva instancia.
También revisaremos en Wireshark…
Como podemos ver, se me asigna una nueva cookie a mi sesión y además una nueva instancia. Esto me entrega alta disponibilidad (HA) en caso de que una de las instancias caiga, donde el usuario no es consciente de ello.
Todo está detrás del balanceador: mantengo sesiones y además balanceo carga… ¿Qué mejor? jajaja.
Mencionar que el ASG, como tiene asociado un
desired = 6
, al eliminar una instancia, automáticamente levanta una nueva para cumplir con ese valor.
Subscribe to my newsletter
Read articles from Roberto España directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Roberto España
Roberto España
Ingeniero en Telecomunicaciones con enfoque en redes, conectividad y automatización. Actualmente estudiando AWS, DevOps y CI/CD. Comparto mi camino con proyectos prácticos y artículos técnicos desde Chile 🇨🇱. https://robertoespana.hashnode.dev/portafolio