Introducción
Si ha oído hablar de Node, o lee algunos artículos que afirman cuán grande es el nodo, podría estar pensando: "¿Qué es exactamente el nodo?" Aunque no para todos, el nodo puede ser la elección correcta para algunas personas.
Para tratar de explicar qué es Node.js, este artículo explora los problemas que puede resolver, cómo funciona, cómo ejecutar una aplicación simple y finalmente, cuándo es y cuándo no es una buena solución. Este artículo no cubre cómo escribir una aplicación de nodo compleja, ni es un tutorial de nodo integral. Leer este artículo debería ayudarlo a decidir si debe aprender el nodo para usarlo para su negocio.
¿Qué es el nodo diseñado para resolver?
El objetivo de Node reclamado públicamente es "proporcionar una forma simple de construir programas de red escalables". ¿Cuáles son los problemas con el programa de servidor actual? Hagamos un problema matemático. En idiomas como Java ™ y PHP, cada conexión genera un nuevo hilo, que puede requerir 2 MB de memoria complementaria por nuevo hilo. En un sistema con 8 GB de RAM, el número máximo teórico de conexiones concurrentes es de 4,000 usuarios. A medida que su base de clientes crece, desea que su aplicación web admita más usuarios, por lo que debe agregar más servidores. Por supuesto, esto aumenta los costos comerciales, especialmente los costos del servidor, los costos de envío y los costos de mano de obra. Además de estos aumentos de costos, hay un problema técnico: los usuarios pueden usar diferentes servidores para cada solicitud, por lo que cualquier recurso compartido debe compartirse entre todos los servidores. Por ejemplo, en Java, las variables estáticas y los cachés deben compartirse entre JVM en cada servidor. Este es el cuello de botella en toda la arquitectura de la aplicación web: el número máximo de conexiones concurrentes que un servidor puede manejar.
La solución de Node a este problema es cambiar la forma en que la conexión se conecta al servidor. Cada conexión crea un proceso que no requiere un bloque de memoria complementario, en lugar de generar un nuevo hilo del sistema operativo para cada conexión (y asignarle algo de memoria complementaria). Node afirma que nunca se bloqueará porque no permite bloqueos en absoluto, y no bloqueará las llamadas de E/S directamente. Node también afirma que el servidor que lo ejecuta puede admitir decenas de miles de conexiones concurrentes. De hecho, el nodo cambia la cara del servidor al cambiar los cuellos de botella en todo el sistema desde el número máximo de conexiones a tráfico para un solo sistema.
Ahora que tiene un programa que puede manejar decenas de miles de conexiones concurrentes, ¿qué puede construir realmente con el nodo? Si tiene una aplicación web que necesita manejar tantas conexiones, ¡sería una cosa "horrible"! Eso es un "si tienes este problema, no es un problema en absoluto". Antes de responder a la pregunta anterior, echemos un vistazo a cómo funciona el nodo y cómo está diseñado para funcionar.
El nodo definitivamente no es
Sí, Node es un programa de servidor. Sin embargo, ciertamente no se parece a Apache o Tomcat. Esos servidores son productos de servidor independientes que permiten que las aplicaciones se instalen e implementen de inmediato. Con estos productos, puede poner en funcionamiento un servidor en un minuto. El nodo ciertamente no es este tipo de producto. Apache puede agregar un módulo PHP para permitir a los desarrolladores crear páginas web dinámicas, y los programadores que usan TomCat pueden implementar JSP para crear páginas web dinámicas. El nodo ciertamente no es este tipo.
En las primeras etapas del nodo (actualmente la versión 0.4.6), no era un programa de servidor "listo para la ejecución", y no puede instalarlo, colocar archivos en él y tener un servidor web completamente funcional. Incluso si desea implementar la función básica del servidor web en funcionamiento después de completar la instalación, todavía se requiere mucho trabajo.
Cómo funciona el nodo
El nodo en sí ejecuta V8 JavaScript. Espera, JavaScript en el servidor? Así es, lo leíste bien. JavaScript del lado del servidor es un concepto relativamente nuevo mencionado hace dos años cuando se discute el producto Aptana Jaxer en Developerworks (ver recursos). Aunque Jaxer nunca ha sido realmente popular, el concepto en sí no está fuera de alcance: ¿por qué no podemos usar el lenguaje de programación utilizado en el cliente en el servidor?
¿Qué hace V8? El motor JavaScript V8 es el motor JavaScript subyacente que Google usa para su navegador Chrome. Pocas personas piensan en lo que JavaScript realmente hace en el cliente? De hecho, el motor JavaScript es responsable de interpretar y ejecutar el código. Usando V8, Google creó un intérprete súper rápido escrito en C ++ que tiene otra característica única; Puede descargar el motor e incrustarlo en cualquier aplicación. No se limita a correr en un navegador. Por lo tanto, Node realmente usa el motor JavaScript V8 escrito por Google y lo reconstruye para su uso en el servidor. ¡Demasiado perfecto! Ahora que hay una buena solución disponible, ¿por qué crear un nuevo idioma?
Programación impulsada por eventos
Muchos programadores los han educado para que crean que la programación orientada a objetos es el diseño de programación perfecto y rechazan otros métodos de programación. El nodo utiliza un llamado modelo de programación basado en eventos.
Listado 1. Programación basada en eventos usando jQuery en el cliente
La copia del código es la siguiente:
// código jQuery en el lado del cliente que muestra cómo funciona la programación basada en eventos
// Cuando se presiona un botón, se produce un evento: lidiar con él
// directamente aquí mismo en una función anónima, donde todos los
// Las variables necesarias están presentes y se pueden hacer referencia directamente
$ ("#myButton"). Click (function () {
if ($ ("#mytextfield"). val ()! = $ (this) .val ())
alerta ("El campo debe coincidir el texto del botón");
});
De hecho, no hay diferencia entre el servidor y el cliente. Sí, no hay operación de clic de botón, ni hay una acción para escribir en un campo de texto, pero en un nivel superior, el evento está ocurriendo. Se establece una conexión - ¡Evento! Los datos se reciben a través de la conexión: ¡eventos! Datos se detiene a través de la conexión - ¡Evento!
¿Por qué este tipo de configuración es ideal para nodo? JavaScript es un gran lenguaje de programación basado en eventos porque permite funciones y cierres anónimos, y lo que es más importante, cualquier persona que haya escrito código esté familiarizado con su sintaxis. La función de devolución de llamada llamada cuando ocurre un evento se puede escribir en el evento de captura. De esta manera, el código es fácil de escribir y mantener, sin marcos complejos orientados a objetos, sin interfaces y sin el potencial de estructurar nada en él. ¡Solo escuche el evento, escriba una función de devolución de llamada y luego la programación basada en eventos se encargará de todo!
Aplicación de nodo de muestra
Finalmente, ¡veamos algún código! Combinemos todo lo que hemos discutido y creemos nuestra primera aplicación de nodo. Dado que ya sabemos que el nodo es ideal para manejar aplicaciones de alto tráfico, crearemos una aplicación web muy simple, una aplicación creada para la máxima velocidad. Estos son los requisitos específicos para nuestra aplicación de muestra explicada por "Boss": cree una API RESTFOR del generador de números aleatorios. Esta aplicación debe aceptar una entrada: un parámetro llamado "número". La aplicación luego devuelve un número aleatorio entre 0 y el parámetro y devuelve el número generado al llamado. Dado que "Boss" quiere que sea una aplicación muy popular, debería poder manejar 50,000 usuarios concurrentes. Echemos un vistazo al código:
Listado 2. Generador de números aleatorios de nodo
La copia del código es la siguiente:
// Estos módulos deben importarse para usarlos.
// El nodo tiene varios módulos. Son como cualquier #include
// o la declaración de importación en otros idiomas
var http = require ("http");
var url = require ("url");
// La línea más importante en cualquier archivo de nodo. Esta función
// hace el proceso real de crear el servidor. Técnicamente,
// El nodo le dice al sistema operativo subyacente que cada vez que un
// Se realiza la conexión, esta función de devolución de llamada en particular debe ser
// ejecutado. Ya que estamos creando un servicio web con REST API,
// Queremos un servidor HTTP, que requiere la variable HTTP
// Creamos en las líneas de arriba.
// Finalmente, puede ver que el método de devolución de llamada recibe una 'solicitud'
// y 'Respuesta' objeto automáticamente. Esto debería ser familiar
// a cualquier programador PHP o Java.
http.createServer (función (solicitud, respuesta) {
// La respuesta debe manejar todos los encabezados y los códigos de retorno
// Este tipo de cosas se manejan automáticamente en los programas del servidor
// como Apache y Tomcat, pero el nodo requiere que todo se haga usted mismo
Response.Writehead (200, {"Content-type": "Text/Plain"});
// Aquí hay un código de aspecto único. Así es como se recupera el nodo
// Parámetros aprobados de las solicitudes del cliente. El módulo URL
// maneja todas estas funciones. La función de análisis
// deconstruye la URL y coloca los valores clave de la consulta en el
// Objeto de consulta. Podemos encontrar el valor para la clave "número"
// haciendo referencia directamente: la belleza de JavaScript.
var params = url.parse (request.url, true) .query;
var input = params.number;
// Estos son los métodos genéricos de JavaScript que crearán
// Nuestro número aleatorio que vuelve a la persona que llama
var numinput = nuevo número (entrada);
var numOutput = nuevo número (math.random () * numInput) .tofixed (0);
// Escribe el número aleatorio a la respuesta
Response.write (numoutput);
// El nodo requiere que terminemos explícitamente esta conexión. Esto es porque
// El nodo le permite mantener una conexión abierta y pasar datos de un lado a otro,
// aunque ese tema avanzado no se discute en este artículo.
respuesta.end ();
// Cuando creamos el servidor, tenemos que conectar explícitamente el servidor HTTP a
// un puerto. El puerto HTTP estándar es 80, por lo que lo conectaremos a ese.
}). Escuchar (80);
// emite una cadena a la consola una vez que se inicia el servidor, haciéndonos saber todo
// se inicia correctamente
console.log ("Generador de números aleatorios en ejecución ...");
Coloque el código anterior en un archivo llamado "Random.js". Ahora, para iniciar la aplicación y ejecutarla (y luego crear un servidor HTTP y escuchar las conexiones en el puerto 80), solo ingrese el siguiente comando en su símbolo del sistema: % Node Random.js. Así es como se ve cuando el servidor ya está en funcionamiento:
La copia del código es la siguiente:
root@ubuntu:/home/moila/ws/mike# node random.js
Generador de números aleatorios que se ejecuta ...
Acceder a la aplicación
La aplicación está en funcionamiento. El nodo está escuchando cualquier conexión, probémosla. Dado que creamos una API RESTful simple, podemos usar nuestro navegador web para acceder a esta aplicación. Escriba la siguiente dirección (asegúrese de completar los pasos anteriores): http: // localhost/? Number = 27.
La ventana de su navegador cambiará a un número aleatorio entre 0 y 27. Haga clic en el botón de recarga en su navegador y obtendrá otro número aleatorio. Eso es todo, ¡esta es tu primera aplicación de nodo!
¿Para qué es bueno el nodo?
Hasta ahora, debería poder responder a la pregunta "qué es el nodo", pero es posible que no tenga claro cuándo debe usarla. Esta es una pregunta importante, porque el nodo es bueno para algunas cosas, pero por el contrario, el nodo puede no ser una buena solución para otros en este momento. Debe tener cuidado de decidir cuándo usar el nodo, ya que usarlo en la situación incorrecta puede resultar en un lote codificado.
¿Para qué es bueno?
Como ha visto antes, el nodo es perfecto para situaciones en las que espera tener un alto tráfico, y los requisitos de procesamiento y lógica del lado del servidor no son necesariamente enormes antes de responder al cliente. Los ejemplos típicos del rendimiento sobresaliente del nodo incluyen:
1. API Restful
Un servicio web que proporciona la API RESTful recibe varios parámetros, los analiza, combina una respuesta y devuelve una respuesta (generalmente menos texto) al usuario. Esta es la situación ideal para el nodo, ya que puede construirlo para manejar decenas de miles de conexiones. Todavía no requiere mucha lógica; Simplemente busca algunos valores de una base de datos y combina una respuesta. Dado que la respuesta es una pequeña cantidad de texto y una pequeña cantidad de texto en solicitudes entrantes, el tráfico no es alto y una máquina puede manejar incluso las necesidades de API de las compañías más concurridas.
2. cola de titter
Imagine una empresa como Twitter, que tiene que recibir tweets y escribirlos en una base de datos. De hecho, se alcanzan casi miles de tweets por segundo, y es imposible que la base de datos procese el número de escrituras requeridas durante los períodos pico de manera oportuna. El nodo se ha convertido en una parte importante de la solución a este problema. Como puede ver, el nodo puede manejar decenas de miles de tweets entrantes. Los escribe rápida y fácilmente en un mecanismo de cola de memoria (por ejemplo, Memcached) donde otro proceso separado puede escribirlos en la base de datos. El papel de Node aquí es recopilar rápidamente tweets y pasar esta información a otro proceso responsable de la escritura. Imagine otro diseño: un servidor PHP regular intenta manejar la escritura en la base de datos en sí, cada tweet causará un breve retraso al escribir en la base de datos, porque la llamada de la base de datos está bloqueando el canal. Debido a la latencia de la base de datos, una máquina diseñada como esta solo puede manejar 2000 tweets entrantes por segundo. 1 millón de tweets por segundo requieren 500 servidores. En cambio, el nodo maneja cada conexión sin bloquear el canal, capturando así tantos tweets como sea posible. Una máquina de nodo que puede manejar 50,000 tweets requiere solo 20 servidores.
3. Servidor de archivos de imagen
Una empresa con grandes sitios web distribuidos, como Facebook o Flickr, puede decidir usar todas las máquinas solo para imágenes de servicio. El nodo sería una buena solución a este problema, ya que la compañía puede usarlo para escribir un simple recolectivo de archivos y luego procesar decenas de miles de conexiones. El nodo buscará el archivo de imagen, devolverá el archivo o un error 404, y luego no hará nada. Esta configuración permitirá que dichos sitios web distribuidos reduzcan la cantidad de servidores que necesitan para servir archivos estáticos como imágenes, archivos .js y .css.
¿Para qué es malo?
Por supuesto, en algunos casos, el nodo no es ideal. Aquí hay áreas en las que el nodo no es bueno en:
1. Páginas creadas dinámicamente
Actualmente, Node no proporciona un método predeterminado para crear páginas dinámicas. Por ejemplo, cuando se usa la tecnología Javaserver Pages (JSP), puede crear una página index.jsp que contenga un bucle en dicho fragmento de código JSP. El nodo no admite tales páginas dinámicas impulsadas por HTML. Del mismo modo, Node no es muy adecuado como un servidor web como Apache y Tomcat. Por lo tanto, si desea proporcionar una solución del lado del servidor en el nodo, debe escribir toda la solución usted mismo. Los programadores de PHP no quieren escribir un convertidor PHP para Apache cada vez que implementan una aplicación web, y hasta ahora esto es exactamente lo que el nodo le pide que haga.
2. Aplicaciones pesadas de la base de datos relacional
El propósito del nodo es rápido, asíncrono y no bloqueado. Las bases de datos no necesariamente comparten estos objetivos. Son sincrónicos y bloqueados, porque las llamadas a la base de datos durante la lectura y la escritura bloquearán el canal hasta que se genere el resultado. Por lo tanto, una aplicación web que requiere muchas llamadas de base de datos, muchas lecturas, muchas escrituras por solicitud es muy inadecuada para el nodo, porque la base de datos relacional en sí puede compensar las muchas ventajas del nodo. (La nueva base de datos NoSQL es más adecuada para el nodo, pero ese es otro tema completamente).
Conclusión
La pregunta es "¿Qué es Node.js?" debería haber sido respondido. Después de leer este artículo, debería poder responder esta pregunta en algunas oraciones claras y concisas. Si es así, ha llegado a la vanguardia de muchos codificadores y programadores. He hablado de nodo con muchas personas, pero han sido confundidos sobre qué es exactamente el nodo. Es comprensible que tienen la mentalidad de Apache: un servidor es una aplicación que coloca archivos HTML y todo funcionará correctamente. Y el nodo es impulsado por el propósito. Es un programa de software que utiliza JavaScript para permitir a los programadores crear servidores web rápidos y escalables. Apache está listo para ejecutarse, mientras que el nodo está codificando listo para ejecutarse.
Node logra su objetivo de proporcionar un servidor altamente escalable. En lugar de asignar un modelo "un hilo por conexión", utiliza un modelo "One Process por conexión" para crear solo la memoria requerida para cada conexión. Utiliza un motor JavaScript muy rápido de Google: el motor V8. Utiliza un diseño basado en eventos para mantener el código mínimo y fácil de leer. Todos estos factores contribuyen al objetivo ideal del nodo: es más fácil escribir una solución altamente escalable.
Tan importante como comprender qué es el nodo, comprender lo que no es. El nodo no es un reemplazo para Apache, que está diseñado para hacer que las aplicaciones web de PHP sean más escalables. Este es de hecho el caso. En esta etapa inicial de nodo, es poco probable que una gran cantidad de programadores lo usen, pero en escenarios en los que funciona, funciona muy bien.
¿Qué debo esperar del nodo en el futuro? Esta es quizás la pregunta más importante que menciona este artículo. Ahora que sabes lo que hace ahora, deberías preguntarte qué hará a continuación. Durante el próximo año, espero que Node proporcione una mejor integración con las bibliotecas de soporte de terceros existentes. Muchos programadores de terceros han desarrollado complementos para Node, incluida la adición de soporte del servidor de archivos y soporte MySQL. Esperemos que Node comience a integrarlos en su funcionalidad central. Finalmente, también quiero que Node admita algún tipo de módulo de página dinámico para que pueda hacer lo que haga en PHP y JSP (quizás una página de NSP, una página de servidor de nodo) en el archivo HTML. Finalmente, con suerte, algún día aparecerá un servidor de nodo "listo para la implementación", que se puede descargar e instalar, simplemente coloque sus archivos HTML, al igual que usar Apache o Tomcat. El nodo todavía está en sus etapas iniciales, pero se está desarrollando muy rápidamente y puede estar pronto en su visión.