¿En qué se diferencia el subprocesamiento múltiple en una aplicación web basada en Java frente a una aplicación Java independiente?

13

Soy bastante nuevo en Java y mi experiencia se limita a las aplicaciones basadas en web que se ejecutan en un contenedor web (Jboss en mi caso).

¿Estoy en lo cierto al decir que para las aplicaciones web el contenedor web se encarga de subprocesos múltiples? Si es así, ¿puedo introducir nuevos pasos en aplicaciones basadas en web? ¿Hay alguna ventaja en hacerlo y en qué escenario se necesitaría hacer eso?

kapricanon
fuente
Hasta EE6 no utilizarás hilos; EE7 presenta Concurrency Utilities.
Restablece a Monica - M. Schröder el

Respuestas:

20

¿Estoy en lo cierto al decir que para las aplicaciones web el contenedor web se encarga de subprocesos múltiples?

La mayoría de los servidores web (Java y otros, incluido JBoss) siguen un modelo de "un subproceso por solicitud", es decir, cada solicitud HTTP es procesada completamente por exactamente un subproceso. Este hilo a menudo pasará la mayor parte del tiempo esperando cosas como solicitudes de DB. El contenedor web creará nuevos hilos según sea necesario.

Algunos servidores (en el ecosistema de Java principalmente Netty ) realizan el manejo de solicitudes asíncronas, ya sea con un modelo de "un subproceso hace todo" o algo más complejo. La idea básica es que tener muchos hilos en espera desperdicia recursos, por lo que trabajar de forma asincrónica puede ser más eficiente.

Si es así, ¿puedo introducir nuevos pasos en aplicaciones basadas en web?

Es posible, pero debe hacerse con mucho cuidado, ya que los errores (como pérdidas de memoria o falta de sincronización) pueden causar errores que son muy difíciles de reproducir, o derribar todo el servidor.

¿Hay alguna ventaja en hacerlo y en qué escenario se necesitaría hacer eso?

Bueno, la ventaja es que puedes hacer cosas en paralelo. El uso de hilos para mejorar la velocidad computacional pura es algo que no debe hacer en un servidor web, ya que ralentizaría el manejo de otras solicitudes. Ese tipo de cosas debe hacerse en un servidor separado, probablemente utilizando algún tipo de cola de trabajo.

Un escenario legítimo para subprocesos múltiples en el contexto del manejo de una solicitud HTTP podría ser si necesita acceder a otros recursos de la red, por ejemplo, llamar a varios servicios web diferentes. Si lo hace de una sola vez, debe esperar a que finalice cada llamada. Pero si usa varios hilos, el tiempo de espera total es solo el retraso de la llamada más lenta.

Michael Borgwardt
fuente
3
Tiene sentido. ¿Es la interfaz ExecutorService la mejor manera de crear nuevos hilos en una aplicación web?
kapricanon
44
@kapricanon: sí, a menos que tenga algunos requisitos específicos que no pueda manejar, o su servidor web ya tenga algo similar.
Michael Borgwardt
2

En respuesta a tu pregunta:

¿En qué se diferencia el subprocesamiento múltiple en una aplicación web basada en Java frente a una aplicación Java independiente?

No es diferente Por lo general, las aplicaciones web de software en las que se basa proporcionarán algunos subprocesos múltiples al hacer que cada nueva solicitud sea un hilo. Por puede usar / crear hilos como lo haría con cualquier otra aplicación.

De hecho, los subprocesos múltiples pueden proporcionarle un aumento drástico del rendimiento si lo usa correctamente. Para las tareas intensivas de E / S, como el acceso a la red y el acceso a la unidad de disco, casi siempre se garantiza el aumento del rendimiento. Para tareas computacionalmente intensivas, debe atenerse a la regla de un subproceso por núcleo en el servidor. Por ejemplo, si su núcleo tiene un procesador i7, debe atenerse a 7 hilos para realizar tareas computacionales.

En respuesta a tu pregunta:

¿Hay alguna ventaja en hacerlo y en qué escenario se necesitaría hacer eso?

Michael Borgwart dice que no debes hacer esto para mejorar la velocidad computacional. No estoy de acuerdo, ya que este artículo sugiere que los subprocesos múltiples pueden ayudar a proporcionar capacidad de respuesta cuando los usuarios necesitan una tarea computacionalmente pesada. En inglés simple, los usuarios no tendrán que esperar tanto tiempo para completar tareas computacionalmente pesadas con subprocesos múltiples.

Si tiene la intención de usar muchos hilos, sugiero el uso de un grupo de hilos. Esto reducirá la sobrecarga de crear hilos.

SyntaxRules
fuente
¿Cómo responde esto a la pregunta que se hace?
mosquito
1
Las respuestas deben basarse en sus propios méritos. Si quieres comentar primero tendrás que ganar 50 puntos de reputación.
ChrisF
1

Bueno, esta es una buena pregunta y creo que la mayoría de los desarrolladores que trabajan en el desarrollo de aplicaciones web no utilizan el subprocesamiento múltiple explícitamente. El motivo es bastante obvio ya que está utilizando un servidor de aplicaciones para implementar su aplicación, el servidor de aplicaciones administra internamente un grupo de subprocesos para las solicitudes entrantes.

Entonces, ¿por qué usar multihilo explícitamente? ¿Qué necesita un desarrollador de aplicaciones web para exponerse a subprocesos múltiples?

Cuando trabaja en una aplicación a gran escala donde tiene que procesar muchas solicitudes al mismo tiempo, es difícil atender cada tipo de solicitud de forma síncrona porque un tipo particular de solicitud podría haber estado procesando mucho, lo que podría reducir el rendimiento de su aplicación.

Tomemos un ejemplo en el que una aplicación web después de atender un tipo particular de solicitud tiene que notificar a los usuarios por correo electrónico y SMS. Hacerlo sincrónicamente con el hilo de solicitud podría reducir el rendimiento de su aplicación web. Entonces aquí viene el papel de mutlithreading. En tales casos, es aconsejable desarrollar una aplicación multiproceso independiente a través de la red que sea responsable de enviar correos electrónicos y SMS únicamente.

Anurag Sharma
fuente
¿Por qué esta respuesta es rechazada?
Anurag Sharma