2012-04-03 21 views
5

Estaba pasando por este Question sobre encuestas largas en las que, además de proporcionar la solución, se ha planteado un punto interesante con respecto a la ineficacia de Apache para gestionar un gran número de solicitudes. ¿Tenía la misma preocupación por Apache Tomcat?¿Qué tan eficiente es Apache Tomcat para Long Polling?

Apache Tomcat es lo suficientemente eficiente como para manejar el sondeo largo. Sé por una parte que Apache Tomcat admite una cantidad bastante grande de subprocesos simultáneos, pero ¿está escalado a tal límite que podemos usarlo para Long Polling en la forma en que lo explica el hilo mencionado anteriormente?

+0

En mi opinión, prefiero un enfoque de sondeo corto con un semáforo (bloqueo giratorio) para manejar este tipo de servicio siempre que sea posible. Si puede sacrificar un par de cientos de milisegundos (el peor de los casos, generalmente solo decenas de milisegundos) de precisión, puede aprovechar los beneficios de poder admitir un número mucho mayor de usuarios simultáneos. –

+0

@TravisJ Sí, una de las opciones, pero el objetivo es lograr la funcionalidad de Facebook, donde tenemos actualizaciones en tiempo real y podemos ver desde Facebook que el cliente siempre está haciendo una solicitud. –

+0

¿Qué parte de Facebook? No todo Facebook es contenido en vivo. ¿Te refieres al chat en vivo? –

Respuesta

5

¿Se refiere a este comentario sobre la question,

ejecutar esto en un servidor web normal como Apache se unirá rápidamente todas las "hebras de trabajo" y
dejarlo incapaz de responder a otra solicita

Las versiones recientes de Apache Tomcat apoyan comet que permite el bloqueo de IO no permitir que Tomcat para escalar a un gran número de solicitudes. De esta article,

Gracias a la capacidad de no bloqueo de E/S introducida en Java 4 Nueva I/API S para el paquete de la plataforma Java (NIO), una conexión HTTP constante no requiere que una hilo constantemente unido a ella. Los subprocesos se pueden asignar a las conexiones solo cuando se procesan las solicitudes . Cuando una conexión está inactiva entre las solicitudes, el hilo puede ser reciclado, y la conexión se coloca en un NIO centralizado seleccionar establecido para detectar nuevas solicitudes sin consumir un hilo separado. Este modelo , llamado subproceso por solicitud, permite potencialmente que los servidores web a manejen un número creciente de conexiones de usuario con un número fijo de subprocesos . Con la misma configuración de hardware, los servidores web que se ejecutan en este modo escalan mucho mejor que en el modo de subproceso por conexión. Hoy en día, los populares servidores web, incluidos Tomcat, Jetty, GlassFish (Grizzly), WebLogic y WebSphere, todos usan subprocesos por solicitud a través de Java NIO.

+0

¿Qué significa 'conjunto de selección de NIO centralizado'? – John

2

ver este report comparing Tomcat and Jetty for Comet:

  • Tomcat tiende a tener un mejor rendimiento cuando hay pocas conexiones muy ocupados. Tiene una ligera ventaja en la latencia de solicitud, que es más evidente cuando se envían muchas solicitudes/respuestas a través de unas pocas conexiones sin ningún tiempo de inactividad significativo.

  • Jetty tiende a tener una mejor escalabilidad cuando hay muchas conexiones con tiempo inactivo significativo, como es la situación para la mayoría de los sitios web. La pequeña huella de memoria de Jetty y el uso avanzado de NIO permiten una mayor cantidad de usuarios por unidad de memoria disponible. Además, el espacio más pequeño significa que el contenedor de servlets consume menos memoria y memoria caché de la CPU, y hay más caché disponible para acelerar la ejecución de aplicaciones no triviales.

  • embarcadero también tiene un mejor rendimiento en lo que respecta a servir contenido estático, como embarcadero es capaz de utilizar los archivos de buffers de memoria antemano asignadas combinados con NIO reunir las escrituras para indicar al sistema operativo para enviar el contenido del archivo a la velocidad máxima de DMA, sin entrar en la memoria de usuario espacio o la JVM.

Si la aplicación va a tener períodos en los que hay conexiones inactivas o clientes que simplemente están a la espera de una respuesta del servidor, a continuación, embarcadero sería una mejor opción sobre Tomcat. Un ejemplo incluiría un ticker de Stock Market, donde los clientes están enviando pocas solicitudes y solo están esperando actualizaciones.

Además, el equipo de Jetty fue el pionero de Comet, y la mayoría de la información y ejemplos que he encontrado tienden a centrarse únicamente en Jetty. Hemos utilizado Jetty en un servidor Comet desde 2008 y estamos contentos con los resultados.

La otra cosa a tener en cuenta es que Jetty está diseñado como un servidor web independiente. Esto significa que no necesita un servidor Apache frente a Jetty. Ejecutamos Jetty de forma independiente en el puerto 80 para atender todas las solicitudes de nuestra aplicación, incluidas las solicitudes de Comet.

Si utiliza Tomcat para solicitudes de cometas, lo más probable es que necesite permitir el acceso directo al puerto 8080 y eludir Apache, ya que Apache puede negar su larga encuesta.

Cuestiones relacionadas