web-services - microframework - scala web framework
¿Por qué el marco web de ascensor es escalable? (4)
Quiero saber las razones técnicas por las que el marco web de elevación tiene un alto rendimiento y escalabilidad. Sé que usa scala, que tiene una biblioteca de actores, pero de acuerdo con las instrucciones de instalación, la configuración predeterminada es con embarcadero. Entonces, ¿usa la biblioteca del actor para escalar?
Ahora es la escalabilidad construida de la caja. Simplemente agregue servidores y nodos adicionales y se escalará automáticamente, ¿así es como funciona? Puede manejar más de 500,000 conexiones simultáneas con servidores compatibles.
Estoy tratando de crear un marco de servicios web para el nivel empresarial, que pueda superar lo que está disponible y que sea fácil de escalar, configurar y mantener. Mi definición de escalamiento solo agrega más servidores y debería poder acomodar la carga extra.
Gracias
El enfoque de Lift para la escalabilidad está dentro de una sola máquina. Escalar las máquinas es un tema más grande y más difícil. La respuesta corta es: Scala y Lift no hacen nada para ayudar o dificultar el escalamiento horizontal.
En cuanto a los actores dentro de una sola máquina, Lift logra una mejor escalabilidad porque una única instancia puede manejar más solicitudes concurrentes que la mayoría de los otros servidores. Para explicarlo, primero debo señalar los defectos en el modelo clásico de manejo de hilos por solicitud. Tenga paciencia conmigo, esto requerirá alguna explicación.
Un marco típico usa un hilo para atender una solicitud de página. Cuando el cliente se conecta, el marco asigna un hilo de un grupo. Ese hilo hace tres cosas: lee la solicitud de un socket; realiza algún cálculo (potencialmente con I / O a la base de datos); y envía una respuesta al socket. En casi todos los pasos, el hilo terminará bloqueando durante un tiempo. Al leer la solicitud, puede bloquearse mientras espera la red. Al hacer el cálculo, puede bloquear en el disco o en la red de E / S. También puede bloquear mientras espera la base de datos. Finalmente, al enviar la respuesta, puede bloquear si el cliente recibe datos lentamente y las ventanas TCP se llenan. En general, el hilo puede pasar del 30 al 90% del tiempo bloqueado. Sin embargo, gasta el 100% de su tiempo en esa única solicitud.
Una JVM solo puede admitir tantos subprocesos antes de que realmente se ralentice. La programación de subprocesos, la contención para las entidades de memoria compartida (como grupos de conexiones y monitores) y los límites de OS nativos imponen restricciones sobre cuántos subprocesos puede crear una JVM.
Bien, si la JVM está limitada en su número máximo de subprocesos y la cantidad de subprocesos determina cuántas solicitudes concurrentes puede manejar un servidor, entonces el número de solicitudes concurrentes vendrá determinado por el número de subprocesos.
(Hay otros problemas que pueden imponer límites más bajos, como el golpeteo de GC, por ejemplo. Los hilos son un factor limitante fundamental, ¡pero no el único!)
El levantamiento desacopla el hilo de las solicitudes. En Lift, una solicitud no vincula un hilo. Más bien, un hilo realiza una acción (como leer la solicitud), luego envía un mensaje a un actor. Los actores son una parte importante de la historia, ya que están programados a través de hilos "ligeros". Se utiliza un conjunto de hilos para procesar mensajes dentro de los actores. Es importante evitar operaciones de bloqueo dentro de los actores, por lo que estos hilos se devuelven al grupo rápidamente. (Tenga en cuenta que este grupo no es visible para la aplicación, es parte del soporte de Scala para los actores). Una solicitud que actualmente está bloqueada en la base de datos o E / S de disco, por ejemplo, no mantiene ocupada una cadena de gestión de solicitudes. El hilo de manejo de solicitudes está disponible, casi de inmediato, para recibir más conexiones.
Este método para desacoplar solicitudes de hilos permite que un servidor de elevación tenga muchas más solicitudes concurrentes que un servidor de subprocesos por solicitud. (También me gustaría señalar que la biblioteca Grizzly admite un enfoque similar sin actores). Más solicitudes concurrentes significa que un único servidor Lift puede admitir más usuarios que un servidor Java EE normal.
Jetty puede ser el punto de entrada, pero el actor termina atendiendo la solicitud, sugiero echarle un vistazo al ejemplo de Twitter, ''skitter'' para ver cómo se puede crear un servicio muy escalable. IIRC, esta es una de las cosas que hizo que la gente de Twitter tomara nota.
Realmente me gusta la respuesta de @dre ya que él declara correctamente que el estado del ascensor es un problema potencial para la escalabilidad horizontal.
El problema: en lugar de describir todo de nuevo, revisa la discusión (no el contenido) en esta publicación. http://javasmith.blogspot.com/2010/02/automagically-cluster-web-sessions-in.html
La solución sería como @dre dijo la configuración de la sesión adhesiva en el equilibrador de carga en el frente y agregar más instancias. Pero dado que el manejo de solicitudes en el levantamiento se realiza en la combinación hilo + actor, puede esperar que una instancia maneje más solicitudes que las estructuras normales. Esto daría una ventaja sobre tener sesiones adhesivas en otros marcos. es decir, la capacidad de la instancia individual para procesar más puede ayudarlo a escalar
- tienes integración con Akka lift, lo que sería otra ventaja en esto.
en mtnyguard
"Scala y Lift no hacen nada para ayudar o dificultar el escalado horizontal"
No es del todo correcto. El levantamiento es un marco altamente estable. Por ejemplo, si un usuario solicita un formulario, solo puede publicar la solicitud en el mismo equipo de donde vino el formulario, porque la acción de proceso del formulario se guarda en el estado del servidor.
Y esto es realmente algo que obstaculiza la escalabilidad de alguna manera, porque este comportamiento no es compatible con la arquitectura de la nada compartida.
Sin duda, la elevación es altamente eficiente, pero el rendimiento y la escalabilidad son dos cosas diferentes. Entonces, si desea escalar horizontaly con lift, debe definir sesiones adhesivas en el loadbalancer que redireccionará a un usuario durante una sesión a la misma máquina.