¿Node.js realmente aumenta la escalabilidad?

21

He estado leyendo sobre el problema C10K, y de particular interés es la parte que se refiere a la E / S asíncrona del servidor. http://www.kegel.com/c10k.html#aio

Creo que esto resume más o menos lo que Node.js hace en el servidor, al permitir que los subprocesos procesen las solicitudes de los usuarios mientras confía en las interrupciones de E / S (eventos) para notificar a los subprocesos los trabajos que se completan, en lugar de que el subproceso sea responsable del Trabajo de CPU completo. El hilo puede continuar con otras cosas (sin bloqueo) y recibir una notificación cuando se realiza un trabajo (por ejemplo, se encuentra un archivo o se comprime un video).

Posteriormente, esto significa que un subproceso está más 'disponible' para los sockets y, por lo tanto, para los usuarios del servidor.

Entonces encontré esto: http://teddziuba.com/2011/10/straight-talk-on-event-loops.html

¡El escritor aquí afirma que aunque el marco controlado por eventos (subprocesos interrumpidos) puede liberar subprocesos, en realidad no reduce la cantidad de trabajo que tiene que hacer una CPU! La razón aquí es que si, por ejemplo, un usuario solicita comprimir un video que cargó, la CPU todavía tiene que hacer este trabajo y se bloqueará mientras lo hace (por simplicidad, olvidemos el paralelismo aquí, a menos que usted ¡conocer mejor!).

Soy un codificador directo, no un administrador del servidor ni nada de eso. Solo me interesa saber: ¿Es Node.js un regalo de los dioses de la 'computación en la nube' o es todo aire caliente, y en realidad no ahorrará a las empresas tiempo y / o dinero al mejorar la escalabilidad?

Muchas gracias.

Alex
fuente
12
En primer lugar, ted es un troll, en segundo lugar, node.js está destinado a aplicaciones vinculadas a IO, no a aplicaciones vinculadas a la CPU. Lo que quieres es una combinación de los dos. Cualquier cosa vinculada a la CPU entra en un nuevo hilo / proceso. Cualquier cosa vinculada a IO va en un bucle de eventos.
Raynos
1
+! Ese tipo es definitivamente un troll.
Patrick Hughes
Depende de lo que compares, si sigues usando Apache (por alguna razón), entonces Node es un regalo de dioses, pero si lo comparas con Nginx, las mejoras son mucho menos drásticas y Node es aún más lento. (diez veces más lento, 2 ms frente a 20 ms para generar una respuesta, PERO en nuestras pruebas, Nginx estaba dando 504 bajo carga moderadamente pesada, y Node estaba dando respuestas normales).
c69
Ahora lo mencionan chicos, el chico troll es claramente un troll. @ c69 es buena información, muchas gracias.
Alex
Su enlace de "conversación directa sobre bucles de eventos" ya no funciona.
Robert Harvey

Respuestas:

20

Por supuesto, cualquier trabajo vinculado a la CPU utilizará la CPU. Bloqueará la CPU en cualquier idioma o marco en el que la escriba.

Node.js es ideal para cuando tienes trabajo de E / S, no CPU. No haría levantamientos pesados ​​en Node, aunque se puede hacer. Node.js resuelve problemas reales , no ficticios o imaginarios, como los servidores de números de Fibonacci . No es "aire caliente".

Josh K
fuente
Simplemente comprobando algunos puntos de referencia y, de hecho, parece mucho más rápido al servir páginas: zgadzaj.com/… .. Supongo que esto es lo que estaba buscando ...
Alex
3
@AlexW: Un buen punto sobre esos puntos de referencia es que esencialmente estás sirviendo contenido estático. Vea mi artículo Millones de visitas al día . Hacer girar el intérprete PHP para eso es un desperdicio. Mire algo como node-static para servir directorios de archivos.
Josh K
@AlexW, ¡Solo para recordar que zgadzaj.com/… usa node.js 0.1.103, que ahora es antiguo!
Samyak Bhuta
4

Si bien el documento C10K está algo desactualizado con respecto a los detalles de implementación, la concurrencia basada en eventos (el modelo del reactor) sigue siendo en algunos aspectos superior a la programación preventiva. Por ejemplo, un modelo de programación preventiva puede programar subprocesos mientras están bloqueados por E / S. Esto permite que el nodo (y otras herramientas como Ruby's Event Machine y Python's Twisted) utilicen mejor los ciclos disponibles al pasar más tiempo haciendo trabajo real y menos tiempo bloqueando.

Rein Henrichs
fuente
-1

Multithreading todavía aumenta el rendimiento. La explicación original es idiota ya que no considera la existencia de múltiples núcleos. En el momento en que tiene más de un núcleo, los hilos no son más hilos. Son hyperthreads. Cualquier aplicación intensiva de subprocesos se beneficiará de ella más que una sola aplicación de subprocesos.

aanand_ub
fuente
2
Sin embargo, esto realmente no explica el fervor de Node.JS. El beneficio principal de Node.JS es su capacidad para manejar y despachar rápidamente múltiples solicitudes desde un solo hilo, no para manejar efectivamente cargas de trabajo en segundo plano pesadas, que su respuesta no aborda.
Robert Harvey
El beneficio principal de node.js es tener un solo idioma para front y backend. Todas estas otras afirmaciones son simplemente esponjosas para que parezca más importante.
cuál es
2
La concurrencia de un solo subproceso de @whatsisname es un gran beneficio, mucho más grande que tener un solo idioma en mi opinión.
favor,