java - para - Aplicación web de balance de carga
servidor apache tomcat (1)
En primer lugar, querrá configurar su equilibrador de carga para las sesiones de afinidad de sesión / adhesivas, para que continúe enviando todas las solicitudes al mismo Tomcat (siempre que esté activo) basado en JSESSIONID.
El documento de agrupación en clúster de Tomcat establece dos requisitos importantes para que su aplicación pueda replicar sus sesiones con éxito:
- Todos los atributos de su sesión deben implementar
java.io.Serializable
- Asegúrese de que su web.xml tenga el elemento
<distributable/>
o establecido en su<Context distributable="true" />
Si empiezas a poner objetos en sesión que no implementan Serializable
(o que tienen propiedades / campos que no implementan Serializable
), entonces tendrás problemas.
(En realidad, todos estos puntos se aplican independientemente del contenedor de servlet que esté utilizando, creo).
Actualización: para abordar algunas de las preguntas en los comentarios sobre por qué usar sesiones rápidas cuando se equilibra la carga entre varios servidores, creo que es más fácil de explicar con un ejemplo.
En primer lugar, esto solo importa si su aplicación mantiene algún tipo de datos en la sesión, lo que puede no ser para todas las aplicaciones (aunque probablemente sea la mayoría). Si no mantiene los datos en la sesión, es probable que no le importe nada de esto y puede dejar de leer aquí.
Tener un entorno en el que mantenga los datos en la sesión, pero no tiene una sesión fija, abriría un mundo de dolores de cabeza.
Digamos que first.jsp
actualiza algún valor en un atributo de sesión particular, y second.jsp
pasa a leer este mismo atributo de sesión. Puede configurar Tomcat para replicar los datos de la sesión en todos los servidores del clúster, pero esta replicación no se produce de forma instantánea. ¿Qué pasa si la solicitud inicial para first.jsp
es manejada por server1
y un nanosegundo después de que se completa, el mismo visitante realiza una solicitud a second.jsp
, que en su entorno no adhesivo es manejado por server2
? Dado que la replicación no es instantánea, ¿tiene alguna forma de saber si está leyendo los datos de sesión más actualizados? ¿Tiene que agregar algún tipo de lógica para sincronizar sus lecturas en el clúster? Esto se convertiría en un dolor gigante.
La configuración de la afinidad de sesión / sesiones pegajosas elimina este dolor de cabeza; Al tener todas las solicitudes del mismo servidor cliente por el mismo nodo, no tiene que preocuparse por "¿está este nodo actualizado en el momento en que gestiona la solicitud?" Cuando el nodo falla, el cliente aún puede realizar una conmutación por error a otro nodo en el clúster, que tiene una copia de sus datos de sesión, pero con sesiones pegajosas esto se convierte en un caso raro y no en la norma.
Hay otra razón para querer sesiones pegajosas: carga entre los nodos en el clúster. Si una solicitud en una sesión podría ser manejada por cualquier nodo, eso implicaría que tiene la replicación de todos a todos configurada en el clúster (lo que significa que los datos de la sesión de node1 se corresponden a node2, node3, ..., node N, los datos de sesión de node2 se replican en node1, node3, ... none N, etc). La replicación de la sesión de todos a todos puede hacer que el ancho de banda y los recursos sean más intensivos cuando el clúster se hace más grande, porque cada adición al clúster significa otro nodo que necesita comunicarse con todos los demás nodos del clúster.
Una alternativa a esto es tener los datos de un nodo replicados a solo unos pocos "amigos" en el clúster, de modo que en caso de que el nodo falle, los datos estén disponibles en otro lugar pero sin que cada nodo tenga que tener una copia. En este escenario, configuraría el clúster de modo que el nodo 1 tenga sus datos replicados en los nodos 2 y 3, el nodo 2 tenga sus datos replicados en los nodos 3 y 4, etc., formando una cadena. En este escenario, agregar nodos adicionales al clúster no hace que la cantidad de comunicación entre nodos aumente rápidamente como lo hace en un esquema de todos a todos.
Hay servidores web tomcat de carga equilibrada. Cada solicitud puede ser servida por un servidor tomcat diferente.
¿Cómo podríamos encargarnos de esto mientras escribimos código para la aplicación web basada en j2ee (struts)?