2011-12-22 11 views
5

Tengo varios años de experiencia en el desarrollo de aplicaciones web con PHP y también he trabajado extensamente con Java (pero nunca para el desarrollo de aplicaciones web). Estoy completando un gran proyecto en el que he estado trabajando durante los últimos seis meses, construido en PHP/CodeIgniter y alojado con CloudControl (proporciona aprovisionamiento y escalabilidad automáticos del servidor).Preguntas sobre Java para desarrollo web de un desarrollador de PHP

El proyecto ha ido bien, y PHP cubrió mis necesidades, pero ahora estoy en la fase inicial de desarrollo de una aplicación web que estará dirigida a usuarios empresariales y estoy considerando usar Java (posiblemente 'Grails') junto con AWS Elastic Beanstalk.

Mi primera pregunta es: multi-threading, ¿con qué frecuencia se utiliza en el desarrollo de aplicaciones web para Java? Con mi aplicación PHP, mi servidor podría haber tenido que realizar una llamada API a Facebook en respuesta a la solicitud de un usuario (por ejemplo, publicar en el muro de un usuario). Para evitar que mi proceso de PHP aguarde en la finalización de la llamada a la API antes de volver al usuario, utilicé servidores de trabajos de queros de Gearman con trabajadores para descargar el trabajo de mi servidor de aplicaciones principal a un trabajador en segundo plano.

¿Podría un desarrollador Java simplemente girar un hilo solo para manejar la llamada API y hacer que el proceso principal vuelva al usuario? ¿Es esta la mayor fortaleza del desarrollo de Java sobre PHP? ¡Gracias!

+1

He estado alimentándome con ambos idiomas por un tiempo jeje. Mi muy humilde opinión es: la fortaleza de Java es la disponibilidad de API y bibliotecas. Para PHP es la velocidad para construir un prototipo o una versión funcional. Mírame ahora, he elegido java una vez más para un nuevo proyecto porque sabía que podía usar Apache POI en lugar de PHPExcel ... una especie de pereza. :) – Alfabravo

+1

Sé que la capacidad de engendrar nuevos hilos es una novedad para un desarrollador PHP (como yo) y tener el poder de usar esta bonita característica que tan deficiente falta en PHP da lugar a una gran cantidad de "ooh, podría hacer esto, y esto, y estas cosas "tipo de pensamientos, pero sé respetuoso. Escuché muchas historias de desarrolladores viniendo de PHP a algún lenguaje que permite multi-threading, y entrar en una situación en la que han comenzado 100 hilos para hacer el trabajo de algo que razonablemente se podría haber hecho en 3, y luego preguntándome por qué el servidor está corriendo como un perro. – DaveRandom

+0

He utilizado subprocesos cuando los usuarios requieren que los datos estén disponibles (¡el rendimiento es una característica!) Y reunirlos requerirá largos tiempos de espera en un solo subproceso. Estoy seguro de que hay muchos otros casos en los que resulta útil, pero no es una bala de plata o un primer pensamiento al construir algo. – Alfabravo

Respuesta

2

¿Un desarrollador de Java simplemente giraría un hilo solo para manejar la llamada API y hacer que el proceso principal vuelva al usuario?

Depende.

Si lo hace, entonces el hilo original puede hacer algo más por un tiempo, pero a menos que esté diseñado para ser un evento, eventualmente tendrá que esperar a que el hilo secundario termine ... y usted está donde comenzaste (En realidad son peores ..., ya que ahora tiene 2 hilos esperando.)


En el caso de un servidor web implementado usando servlets Java clásicos, cada solicitud de usuario se ejecuta en su propio hilo. El enfoque simple sería realizar la llamada API en el hilo de solicitud. Esto bloquea el hilo, pero otros hilos pueden estar trabajando en otras solicitudes mientras esto sucede. Suponiendo que tiene suficientes subprocesos en el grupo de subprocesos del contenedor web, esto funciona bien ... aunque termine usando muchos recursos (memoria) en las pilas de subprocesos.

Las versiones más recientes de las especificaciones del servlet de Java han agregado soporte para el procesamiento asíncrono. No estoy a la altura de los detalles, pero esto te permitiría, en teoría, desconectar un hilo de solicitud de una solicitud, mientras que el segundo estaba haciendo algo que llevó mucho tiempo. Sin embargo, no estoy convencido de que esto ayude aquí ... a menos que tenga una implementación del lado del cliente de la API que sea similarmente capaz de ejecutar múltiples solicitudes simultáneas en paralelo usando un número pequeño (y acotado) de subprocesos de Java.

Posiblemente haya otras alternativas, pero podrían ser mucho más trabajo.


Mi consejo sería ir por una solución simple para empezar. Solo haga la llamada API en el hilo de solicitud y configure su servidor web para usar una cantidad razonable de hilos de solicitud.

Lo más probable es que pueda salirse con la suya "malgastando" algo de memoria para obtener el rendimiento que realmente necesita. A largo plazo, es posible que deba abordar eso, pero habrá tenido tiempo de aprender más sobre las alternativas más escalables para entonces.

+0

Está bien, ahora veo que cualquier subproceso generado por un proceso debe completarse antes de que finalice el subproceso de ejecución iniciado por una solicitud de usuario. Con mi servidor PHP, CloudControl, solo tengo permitido dos procesos por caja. Para reducir mi necesidad de aprovisionar cajas adicionales, utilicé un servidor de puesta en cola de trabajos y ejecuté varios trabajadores en segundo plano que esperan trabajos, lo que permite que el hilo principal vuelva cuando no tiene que esperar el resultado de una llamada API. –

Cuestiones relacionadas