¿Qué tiene de especial Node.js? [cerrado]

48

Recientemente ha habido muchos elogios para Node.js. No soy un desarrollador que haya tenido mucha exposición a la aplicación de red. Desde mi conocimiento de Nodes.js, su fortaleza es: tenemos solo un hilo que maneja múltiples conexiones, proporcionando una arquitectura basada en eventos.

Sin embargo, por ejemplo, en Java, puedo crear solo un subproceso usando NIO / AIO (que es API que no bloquea desde mi comprensión), y manejar múltiples conexiones usando ese subproceso, y proporciono una arquitectura basada en eventos para implementar los datos manejo de la lógica (¿no debería ser tan difícil proporcionar alguna devolución de llamada, etc.)?

Dado que JVM es una máquina virtual aún más madura que V8 (espero que también se ejecute más rápido), y la arquitectura de manejo basada en eventos parece ser algo no difícil de crear, no estoy seguro de por qué Node.js está atrayendo tanta atención. ¿Me perdí algunos puntos importantes?

Adrian Shum
fuente
3
Me pregunto por qué se rechaza ... Creo que esta pregunta es más una discusión de programación, así que no puse en stackoverflow. También intenté buscar temas similares, pero solo encontré información sobre la fuerza de Nodes.js, pero mi problema es que realmente no entiendo por qué la "fuerza" es tan única (que todavía no puedo encontrar)
Adrian Shum
66
Intenta implementar ese patrón en Java. Funciona, por supuesto. Pero verá una cosa: será muy, muy detallado en Java: necesita toneladas de devoluciones de llamada, lo que casi siempre significa crear nuevas clases. Eso puede sonar como un pequeño problema, pero en un gran programa puede ponerse feo y difícil de manejar con bastante rapidez.
Joachim Sauer
66
Las devoluciones de llamada de Javascript son igualmente propensas a volverse difíciles de manejar, y tales espaguetis son mucho más fáciles de depurar y refactorizar en Java que en Javascript IMO.
funkybro
55
@AdrianShum: es un efecto slashdot, cualquier cosa que no se ajuste a la mentalidad grupal será rechazada, como alabar a Microsoft en /.
gbjbaanb
3
Me sorprende no ver a nadie mencionar el bombo publicitario.
deadalnix

Respuestas:

33

Si bien ese concepto se puede implementar en muchos idiomas (y como se mencionó dodgy_coder , se ha implementado en Ruby y Python al menos), no es tan trivial como usted dice.

Es cierto que Java tiene API de E / S sin bloqueo. Por lo tanto, puede hacer E / S de red / disco sin formato de forma no bloqueante. Sin embargo, todas las API que de alguna manera envuelven o manejan IO también deben implementarse de manera no bloqueante. Cada analizador XML, cada controlador de base de datos, cada convertidor de formato de archivo debe escribirse para admitir E / S sin bloqueo. Porque si una sola biblioteca está bloqueando en este patrón, eso reduce el rendimiento de sus servidores a valores de edad de piedra.

Node.js tiene esa infraestructura de biblioteca, porque siempre fue diseñada de esa manera: cada biblioteca que se esfuerza por hacerse popular tiene que proporcionar una API asincrónica o no se utilizará.

Joachim Sauer
fuente
18
Sí. En otras palabras: la fortaleza más importante de Node.js es la debilidad más importante de ECMAScript: la biblioteca estándar ECMAScript increíblemente horrible. Dado que los desarrolladores de Node.js tuvieron que reinventar cada rueda de todos modos, tuvieron la oportunidad de reinventarla de la manera correcta.
Jörg W Mittag
44
Bueno, por lo que sé, ECMAScript siempre se diseñó como un lenguaje incrustado, por lo que no había necesidad de API de nivel de sistema operativo de ningún tipo (incluso la red IO se abstrajo principalmente). Esa falta fue de hecho una ventaja para Node.js.
Joachim Sauer
"cada biblioteca que se esfuerza por ser popular tiene que proporcionar una API asincrónica o no se utilizará" Creo que eso es precisamente lo que estoy buscando. ¿Hay algún recurso para analizar cómo se proporciona la API asíncrona para, por ejemplo, el análisis XML y el acceso a la base de datos, en Node.js?
Adrian Shum
1
@AdrianShum en general, busque ejemplos de programación dirigida por eventos. Se pueden encontrar implementaciones específicas en muchos idiomas. Además de los módulos Node.js, puede ver ejemplos Twisted en Python, twistedmatrix.com/trac/wiki , ejemplos POE en Perl, poe.perl.org , y Ruby tiene EventMachine, github.com/eventmachine/eventmachine
mghicks
19

Probablemente la razón principal es que usa JavaScript para escribir componentes del lado del servidor para cosas como servidores web, aplicaciones web o servicios web. Esto unifica el lenguaje de desarrollo tradicional front-end (del lado del cliente) JavaScript con el lenguaje del lado del servidor.

Tiene razón: el hecho de que no sea de bloqueo, el uso del patrón del reactor no es único: se ha hecho antes de usar otros lenguajes y marcos, como Ruby's EventMachine o Python's Twisted, por ejemplo.

dodgy_coder
fuente
55
muy pocas tecnologías tienen características verdaderamente únicas, la singularidad proviene de su combinación particular de todas sus características
jk.
1
De acuerdo, aquí hay una lista de bibliotecas que lo admiten en todos los idiomas principales ... Patrón de Reactor en Wikipedia
dodgy_coder
10

Las tres razones principales que daría son:

  1. IO sin bloqueo / IO asincrónico. Esto está codificado en todas partes en la web y en los carteles anteriores. Una cosa que contribuiría es que diseñar su código para asumir explícitamente comportamientos asincrónicos ayuda al motor del compilador a maximizar el hardware. Sí, muchos de los compiladores JIT y procesadores de hyperthreading toman código sincrónico y ayudan a paralelizar la ejecución. Por supuesto, este es un enfoque de mejor esfuerzo. Por el contrario, al construir explícitamente la aplicación para asíncrono, se asegura que el motor y el hardware puedan maximizar el tiempo de ejecución de su código. Es cierto que no tengo datos cuantificables para probar esto, pero me hace sentir bien por dentro pensar de esta manera.

  2. Base de código único para cliente y servidor. Esto tiene una serie de ventajas: ayuda a optimizar los costos del centro de datos al poder mover la lógica de negocios del servidor al cliente; ayuda a reutilizar la lógica de negocios / validación de datos; reducir la complejidad de las habilidades de desarrollador que deben existir para admitir el producto (en comparación con Python y javascript).

  3. Baja barrera de entrada. En muchos sentidos, Javascirpt es como Basic, Pascal y Perl de ayer. Es muy fácil comenzar a escribir código y no requiere mucho conocimiento de dominio para comenzar. Esto también ayuda a reducir los costos de desarrollo al poder atraer a más desarrolladores jr y aumentar el proyecto. [Por supuesto, debes superar a los ideólogos que creen que los lenguajes de programación deberían ser difíciles para eliminar a los desarrolladores de bajo funcionamiento]

cflat
fuente
No estoy seguro de que recomendaría construir un equipo Node completamente con jr. JS devs. La arquitectura no es realmente algo en lo que tengamos que pensar en más proyectos web / UI de grado jr y JS tarda tanto en ser realmente bueno en términos de construcción a largo plazo como cualquier otro lenguaje, incluso si puede obtener resultados relativamente rápido a un nivel inferior de experiencia en proyectos menos complejos de lo que es típico.
Erik Reppen
Estoy de acuerdo con @ErikReppen; Un equipo de arquitectura compuesto por desarrolladores junior (sin importar el idioma) es como diseñar y construir una casa usando carpinteros que son buenos para construir sillas, mesas y casas para perros.
Comodín el