English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Node.js desde2009Desde su nacimiento hasta la fecha, ya ha desarrollado más de dos años, y su velocidad de crecimiento es visible a simple vista. Desde que la cantidad de visitas en github superó a Rails, hasta que el fundador de Node.jsS, Ryan Dalh, se unió a Joyent y obtuvo financiamiento empresarial el año pasado, hasta la publicación de la versión portátil para Windows este año, el futuro de Node.js ha recibido el reconocimiento de la comunidad técnica. InfoQ ha estado siguiendo el desarrollo de Node.js, y este año ha organizado conferencias especiales en las dos Qcon (estación de Beijing y estación de Hangzhou). Para promover mejor la tecnología de Node.js en China, decidimos abrir la columna "Explicación sencilla y profunda de Node.js", invitando a predicadores, desarrolladores y expertos técnicos del campo de Node.js a hablar sobre todos los aspectos de Node.js, permitiendo a los lectores tener una comprensión más profunda de Node.js y poder participar activamente en discusiones y prácticas de nuevas tecnologías.
El primer artículo de la columna, "¿Qué es Node.js", intenta explicar desde varios ángulos los conceptos básicos, la historia de desarrollo y las ventajas de Node.js, los desarrolladores que no están familiarizados con este campo pueden conocer algunos conocimientos básicos de Node.js a través de este artículo.
Hablemos del nombre
Las noticias técnicas sobre Node.js son cada vez más, las formas de escribir Node.js también son variadas, hay quienes lo escriben como NodeJS, hay quienes lo escriben como Nodejs, ¿cuál es la forma de escritura más estándar? Seguimos la说法 oficial. En el sitio web oficial de Node.js, siempre lo ha llamado "Node" o "Node.js", no se han encontrado otras formas de escribirlo, "Node" se usa más, teniendo en cuenta que la palabra Node tiene un significado y uso muy amplio, lo que puede confundir a los desarrolladores, por lo que hemos adoptado el segundo nombre, "Node.js", el sufijo .js del nombre muestra la intención real del proyecto Node, otros nombres son variados, sin una ubicación clara, no recomendamos su uso.
Node.js no es una aplicación de JS, sino una plataforma de ejecución de JS
al ver el nombre Node.js, los principiantes pueden confundirse y pensar que es una aplicación de Javascript, de hecho, Node.js utiliza C++lenguaje para escribirlo, es un entorno de ejecución de Javascript. ¿Por qué se eligió C?++lenguaje? Según la memoria del fundador de Node.js, Ryan Dahl, inicialmente quería escribir Node.js en Ruby, pero descubrió que la máquina virtual de Ruby no podía cumplir con sus requisitos de rendimiento, más tarde intentó usar V8motor, por lo que se eligió C++lenguaje. Ya que no es una aplicación de Javascript, ¿por qué se llama .js? Porque Node.js es un entorno de ejecución de Javascript. Al mencionar Javascript, lo primero que viene a la mente es el navegador que usamos a diario, los navegadores modernos incluyen varios componentes, incluyendo el motor de renderizado y el motor de Javascript, entre otros, donde el motor de Javascript es responsable de interpretar y ejecutar el código Javascript en las páginas web. Como uno de los lenguajes más importantes para el frontend web, Javascript ha sido el patrimonio de los ingenieros de frontend. Sin embargo, Node.js es un entorno de ejecución de Javascript para el backend (sistemas compatibles incluyen*nux、Windows),lo que significa que puedes escribir código de Javascript a nivel de sistema o de servidor y entregarlo a Node.js para que lo interprete y ejecute, comandos simples como los siguientes:
#node helloworld.jsNode.js
Adopta V del navegador Google Chrome8El motor, con excelente rendimiento, también proporciona muchas API de nivel de sistema, como operaciones de archivos y programación de red. El código de JavaScript en el lado del navegador se ejecuta con varias restricciones de seguridad, limitando la operación del sistema del cliente. Por comparación, Node.js es un entorno de ejecución en segundo plano completo, que proporciona muchas funciones que otros lenguajes pueden implementar a JavaScript.
Node.js utiliza la programación asíncrona y el diseño controlado por eventos, diseñado para servicios de red
El término 'driven por eventos' no es desconocido. En la programación de red de某些lenguajes tradicionales, utilizamos funciones de retroalimentación, como cuando el recurso socket alcanza un estado determinado, la función de retroalimentación registrada se ejecuta. En la filosofía de diseño de Node.js, el núcleo es el controlado por eventos, y la mayoría de las API que proporciona se basan en un estilo asíncrono y basado en eventos. Por ejemplo, en el módulo Net, el objeto net.Socket tiene los siguientes eventos: connect, data, end, timeout, drain, error y close, y los desarrolladores de Node.js necesitan registrar las funciones de retroalimentación correspondientes según su lógica de negocio. Estas funciones de retroalimentación se ejecutan de manera asíncrona, lo que significa que, aunque en la estructura del código, estas funciones parecen registrarse en un orden, no dependen de la secuencia en la que se registren, sino que esperan que se dispare el evento correspondiente. El diseño de eventos y programación asíncrona, (el lector interesado puede consultar otro artículo del autor: 'Estilo de programación asíncrona de Node.js'), tiene la ventaja importante de aprovechar al máximo los recursos del sistema, ejecutando código sin bloquear la espera de que alguna operación se complete, permitiendo que los recursos limitados se utilicen para otras tareas. Este diseño es muy adecuado para la programación de servicios de red en el back-end, y el objetivo de Node.js también está en este sentido. En el desarrollo de servidores, el manejo de solicitudes concurrentes es un gran problema, y las funciones bloqueantes pueden llevar a un desperdicio de recursos y demoras en el tiempo. A través del registro de eventos y las funciones asíncronas, los desarrolladores pueden aumentar la utilización de los recursos y mejorar el rendimiento.
En los módulos de soporte proporcionados por Node.js, podemos ver que muchas funciones, incluyendo las de manejo de archivos, se ejecutan de manera asíncrona, lo que difiere de los lenguajes tradicionales. Además, para facilitar el desarrollo de servidores, Node.js tiene muchos módulos de red, incluyendo HTTP, DNS, NET, UDP, HTTPS y TLS, lo que permite a los desarrolladores construir servidores web rápidamente. Por ejemplo, en un archivo helloworld.js simple:
var http = require('http'); createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(80, "127.0.0.1");
El código anterior construye un servidor http simple (ejemplo de despliegue en http://helloworld.cnodejs.net/ en (los lectores pueden visitar), escuchando en la máquina local80, para cualquier solicitud http, el servidor devuelve un código de estado de encabezado200, Content-El valor de Type es text/una respuesta de texto 'Hello World' en plano. De este pequeño ejemplo, podemos ver varios puntos:
La programación de red de Node.js es bastante conveniente, los módulos proporcionados (aquí es http) abren una interfaz de API fácil de usar, con solo unas pocas líneas de código se puede construir un servidor.
Reflejan la característica de eventos y programación asíncrona, especificando una función de devolución de llamada en los parámetros de la función createServer (implementada mediante una función anónima de JavaScript), cuando se recibe una solicitud http, Node.js llama a la función de devolución de llamada para manejar la solicitud y responder. Por supuesto, este ejemplo es relativamente simple, sin muchos registros de eventos, en los artículos futuros los lectores verán más ejemplos reales.
Las características de Node.js
A continuación, hablemos de las características de Node.js. Las características de eventos y programación asíncrona se han explicado en detalle anteriormente, por lo que no se repetirán aquí.
El rendimiento de Node.js es bastante bueno. Según lo dicho por el fundador Ryan Dahl, el rendimiento es un factor importante que Node.js considera, la elección de C++y V8En lugar de Ruby u otros entornos virtuales basados en la máquina, Node.js también está diseñado con el objetivo de mejorar el rendimiento. Node.js es bastante audaz en su diseño, ya que se ejecuta en modo de un solo proceso y una sola hilo (¡sorprendente, ¿verdad? Esto coincide con la forma en que se ejecuta JavaScript), el mecanismo de eventos es implementado por Node.js a través de una alta eficiencia de la gestión de la cola de ciclos de eventos en un solo hilo interno, sin ocupación de recursos de hilos múltiples y cambio de contexto, lo que significa que frente a solicitudes http a gran escala, Node.js puede manejar todo con el mecanismo de eventos, los desarrolladores de servicios de red acostumbrados a lenguajes tradicionales pueden estar muy familiarizados con la concurrencia y la colaboración de hilos múltiples, pero frente a Node.js, necesitamos aceptar y entender sus características. ¿Podemos entonces inferir que este diseño llevará la presión de la carga al CPU (gestión de ciclos de eventos?) en lugar de la memoria (¿recuerdas los días en que el Java Virtual Machine lanzaba la excepción OutOfMemory?), mejor veremos las pruebas de rendimiento de Node.js realizadas por el equipo de plataformas de datos compartidos de Taobao:
Configuración de la máquina física: RHEL 5.2, CPU 2.2GHz, memoria4G
Escenarios de aplicación de Node.js: proxy de MemCache, cada vez que se toma100 bytes de datos
Tamaño del pool de conexiones:50
Número de usuarios concurrentes:100
Resultados de la prueba (modo socket): memoria (30M) de QPS (16700) de CPU (95por ciento
A partir de los resultados anteriores, podemos ver que en este escenario de prueba, el qps puede alcanzar16700 veces, la memoria solo ocupa30M (donde V8espacio en la pila22M), el CPU alcanza95%, podría convertirse en una restricción. Además, muchos practitioners han realizado análisis de rendimiento en Node.js, y en general, su rendimiento es convincente, también es una de las razones por las que es popular. Dado que Node.js utiliza un solo proceso y un solo hilo, ¿cómo puede Node.js, que tiene un excelente rendimiento en un solo núcleo, aprovechar la CPU multi-núcleo en un entorno de hardware multi-núcleo popular hoy en día? El fundador Ryan Dahl sugiere ejecutar múltiples procesos de Node.js y utilizar ciertos mecanismos de comunicación para coordinar las tareas. Actualmente, ya hay muchos módulos de soporte de multi-proceso de Node.js publicados por terceros, y los artículos posteriores en la columna detallarán la programación de Node.js en un CPU multi-núcleo.
Otra característica de Node.js es que admite varios lenguajes de programación, como Javascript. No se discutirá aquí la comparación de ventajas y desventajas entre lenguajes dinámicos y estáticos. Sólo mencionaré tres puntos:
var hostRequest = http.request(requestOptions,function(response) { var responseHTML =''; response.on('data', function (chunk) { responseHTML = responseHTML + chunk; }); response.on('end',function(){ console.log(responseHTML); // Hacer algo útil }); });
En el código anterior, necesitamos manejar la variable responseHTML en el evento end, debido a las características de closure de JavaScript, podemos definir la variable responseHTML fuera de las dos funciones de callback, y luego modificar su valor en la función de callback correspondiente al evento data, y finalmente acceder a su procesamiento en el evento end.
JavaScript es el lenguaje principal de los ingenieros de frontend, tiene una gran influencia en la comunidad técnica. Además, con el desarrollo continuo de las tecnologías web, especialmente el aumento de la importancia del frontend, muchos ingenieros de frontend han comenzado a probar el agua en aplicaciones de backend, en muchas empresas que utilizan Node.js, los ingenieros han dicho que debido a que están acostumbrados a JavaScript, han elegido Node.js.
Las características de las funciones anónimas y los closures de JavaScript son muy adecuadas para la programación asincrónica y basada en eventos, como podemos ver en el ejemplo helloworld, las funciones de callback se implementan en forma de funciones anónimas, lo que es muy conveniente. El papel de los closures es aún mayor, veamos el siguiente ejemplo de código:
JavaScript tiene un buen rendimiento en los lenguajes dinámicos, algunos desarrolladores han realizado análisis de rendimiento en lenguajes dinámicos como JavaScript, Python, Ruby, etc., y descubrieron que el rendimiento de JavaScript es mejor que otros lenguajes, además de V8El motor también es uno de los mejores de su clase, por lo que el rendimiento de Node.js también se beneficia.
Historia breve del desarrollo de Node.js
2009Año2Mes, Ryan Dahl anunció en su blog que estaba preparando una base para V8Crear un servidor web ligero y proporcionar un conjunto de bibliotecas.
2009Año5Mes, Ryan Dahl lanzó en GitHub la versión inicial de algunos paquetes de Node.js, y en los siguientes meses, algunas personas comenzaron a desarrollar aplicaciones con Node.js.
2009Año11Mes y2010Año4Mes, en ambas conferencias JSConf se programaron charlas sobre Node.js.
2010A fines de año, Node.js recibió el financiamiento del proveedor de servicios de nube Joyent, y el fundador Ryan Dahl se unió a Joyent a tiempo completo para liderar el desarrollo de Node.js.
2011Año7Mes, Node.js lanzó la versión para Windows con el apoyo de Microsoft.
Casos de aplicación de Node.js
A pesar de que Node.js lleva poco más de dos años de existencia, su impulso de desarrollo está gradualmente superando al de Ruby/Rails, aquí hemos enumerado algunos casos de aplicaciones empresariales que utilizan Node.js, escuchemos las voces de los clientes.
En la última aplicación móvil lanzada por el sitio web de redes sociales LinkedIn, NodeJS es la base de la aplicación en el backend. Kiran Prasad, director de desarrollo móvil de LinkedIn, dijo a los medios de comunicación que toda su plataforma de software móvil está construida con NodeJS:
LinkedIn utiliza una gran cantidad de tecnologías, pero en lo que respecta a los servidores móviles, nos basamos completamente en Node.
(Razones para su uso) Primero, debido a su flexibilidad. Segundo, si conoces Node, descubrirás que es excelente para comunicarse con otros servicios. Las aplicaciones móviles deben interactuar con nuestra API de plataforma y base de datos. No hemos hecho mucho análisis de datos. En comparación con la tecnología Ruby on Rails utilizada anteriormente, el equipo de desarrollo descubrió que Node mejora mucho en términos de rendimiento. Corrieron en cada máquina física15un servidor virtual (15una instancia), donde4una instancia puede manejar el doble de tráfico. La evaluación de capacidad se basa en los resultados de las pruebas de carga.
El sitio web de servicios sociales empresariales Yammer ha utilizado Node para crear un servidor proxy de dominio cruzado para su propia plataforma, los desarrolladores de terceros pueden realizar comunicación AJAX con la API de la plataforma Yammer a través de este servidor. El director de tecnología de la plataforma Yammer, Jim Patterson, ha expresado sus propias opiniones sobre los pros y contras de Node:
(Ventajas) Debido a que Node se basa en el modelo de eventos y no bloqueante, es muy adecuado para manejar solicitudes concurrentes, por lo que los servidores proxy construidos en Node tienen un rendimiento mucho mejor en comparación con otras tecnologías de implementación (como Ruby). Además, el código del cliente que interactúa con el servidor proxy de Node se escribe en lenguaje JavaScript, por lo que tanto el cliente como el servidor se escriben en el mismo lenguaje, lo que es muy agradable.
(Desventajas) Node es un proyecto de código abierto relativamente nuevo, por lo que no es muy estable, siempre está cambiando y falta soporte de bibliotecas de terceros suficiente. Parece que es como Ruby/Rails en los años de 2000.
El sitio web de hospedaje de proyectos conocidos GitHub también ha probado aplicaciones Node. Esta aplicación Node se llama NodeLoad y es un servidor de descarga de archivos de archivo (se utiliza cada vez que descarga un tarball o archivo zip de una rama de almacenamiento). El servidor de descarga de archivos de archivo anterior de GitHub estaba escrito en Ruby. En el sistema anterior, las solicitudes de descarga de archivos de archivo creaban una tarea Resque. Esta tarea realmente ejecutaba un comando git archive en el servidor de archivos de archivo, extraía datos de un servidor de archivos. Luego, la solicitud inicial se asignaba a una pequeña aplicación Ruby Sinatra para esperar a que se completara la tarea. En realidad, solo estaba verificando si existía el flag de memcache, y luego redirigiendo a la dirección de descarga final. El sistema anterior funcionó aproximadamente3una instancia de Sinatra y3Un worker de Resque. Los desarrolladores de GitHub consideran que es una excelente oportunidad para aplicaciones Node. Node se basa en el modelo de eventos, lo que le permite manejar mejor los archivos de git en comparación con el modelo bloqueante de Ruby. Durante el proceso de escritura del nuevo servidor de descarga, los desarrolladores sintieron que Node era muy adecuado para esta función, además, también utilizaron la biblioteca socket.io de Node para monitorear el estado de la descarga.
No solo en el extranjero, sino que los beneficios de Node también han atraído la atención de los desarrolladores nacionales, Taobao ha aplicado la tecnología de Node en la práctica:
MyFOX es un intermediario de procesamiento de datos, responsable de extraer datos de un clúster de MySQL, calcular y generar resultados de estadísticas. El usuario envía una sentencia SQL, MyFOX genera las sentencias de consulta necesarias para cada fragmento de base de datos según el significado de la orden SQL, las envía a cada fragmento y luego las suma y calcula. Las características de MyFOX son CPU intensivo, sin E/S de archivos y solo procesa datos de solo lectura. Al principio, MyFOX se escribió en PHP, pero se encontraron muchos problemas. Por ejemplo, PHP es un hilo único, MySQL necesita consultas bloqueantes, por lo que es difícil realizar solicitudes concurrentes de datos, la solución posterior fue usar nginx y dirzzle, y implementar la interfaz basada en el protocolo HTTP, y realizar solicitudes mediante el comando curl_multi_get. Sin embargo, el grupo de proyectos MyFOX finalmente decidió usar Node.js para implementar MyFOX.
Hay muchos motivos para elegir Node.js, como considerar el interés y el desarrollo de la comunidad, y también se espera mejorar la capacidad de concurrencia y aprovechar al máximo el CPU. Por ejemplo, abrir y cerrar conexiones con frecuencia llevará a que muchos puertos estén en estado de espera, y cuando el número de concurrencia aumenta, a menudo se fallará en la conexión debido a que no hay suficientes puertos (están en estado TIME_WAIT). Anteriormente, se solía modificar la configuración del sistema para reducir el tiempo de espera para evitar este error, sin embargo, el uso de una piscina de conexiones puede resolver este problema de manera excelente. Además, antes de que MyFOX apareciera una presión de acceso muy densa en ciertos casos de cacheo, el uso de Node.js puede compartir el estado de la consulta, hacer que ciertas solicitudes 'esperen un momento', para que el sistema pueda rellenar el contenido del cache.
Resumen
Este artículo presenta brevemente los conocimientos básicos de Node.js, incluyendo conceptos, características, historia, casos, etc. Como una2Con el paso de los años, el impulso de desarrollo de Node.js es evidente, cada vez más empresas comienzan a prestar atención y probar Node.js, los desarrolladores de frontend y backend deben conocer el contenido relevante.