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?
fuente
Respuestas:
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á.
fuente
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.
fuente
Las tres razones principales que daría son:
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.
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).
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]
fuente