Diferencia entre revisiones de «Node.js»
(→Fuentes) (Etiqueta: nuestro-nuestra) |
(Etiqueta: nuestro-nuestra) |
||
Línea 129: | Línea 129: | ||
El código anterior crea un servidor http básico esperando a servir peticiones en el puerto 8888. | El código anterior crea un servidor http básico esperando a servir peticiones en el puerto 8888. | ||
− | |||
− | |||
Línea 136: | Línea 134: | ||
== Fuentes == | == Fuentes == | ||
− | [http://www.maestrosdelweb.com/editorial/¿que-es-javascript/ http://www.maestrosdelweb.com/editorial/¿que-es-javascript/] | + | *[http://www.maestrosdelweb.com/editorial/¿que-es-javascript/ http://www.maestrosdelweb.com/editorial/¿que-es-javascript/] |
− | + | *[http://nodejs.org/ http://nodejs.org/] | |
− | [http://nodejs.org/ http://nodejs.org/] | + | *[http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb/ http://debuggable.com/posts/understanding-node-js ] |
− | [http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb/ http://debuggable.com/posts/understanding-node-js ] | + | *[http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8/ http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8] |
− | [http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8/ http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8] | + | *[http://nodejs.org/jsconf.pdf/ http://nodejs.org/jsconf.pdf] |
− | [http://nodejs.org/jsconf.pdf/ http://nodejs.org/jsconf.pdf] | + | *[http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests/ http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests] |
− | [http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests/ http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests] | + | *[http://www.quora.com/Whats-the-difference-between-an-event-loop-and-a-per-request-model/ http://www.quora.com/Whats-the-difference-between-an-event-loop-and-a-per-request-model] |
− | [http://www.quora.com/Whats-the-difference-between-an-event-loop-and-a-per-request-model/ http://www.quora.com/Whats-the-difference-between-an-event-loop-and-a-per-request-model] | + | *[http://stackoverflow.com/questions/3011317/node-js-or-erlang/ http://stackoverflow.com/questions/3011317/node-js-or-erlang] |
− | [http://stackoverflow.com/questions/3011317/node-js-or-erlang/ http://stackoverflow.com/questions/3011317/node-js-or-erlang] | + | *[http://www.erlang.org/] |
− | [http://www.erlang.org/] | + | *[http://stackoverflow.com/questions/3878096/nodejs-nodejs-org-experience-comments/ http://stackoverflow.com/questions/3878096/nodejs-nodejs-org-experience-comments] |
− | [http://stackoverflow.com/questions/3878096/nodejs-nodejs-org-experience-comments/ http://stackoverflow.com/questions/3878096/nodejs-nodejs-org-experience-comments] | + | *[http://www.olympum.com/future/nodes-and-jetties/ http://www.olympum.com/future/nodes-and-jetties] |
− | [http://www.olympum.com/future/nodes-and-jetties/ http://www.olympum.com/future/nodes-and-jetties] | + | *[http://stackoverflow.com/questions/5062614/how-to-decide-when-to-use-nodejs/ http://stackoverflow.com/questions/5062614/how-to-decide-when-to-use-nodejs] |
− | [http://stackoverflow.com/questions/5062614/how-to-decide-when-to-use-nodejs/ http://stackoverflow.com/questions/5062614/how-to-decide-when-to-use-nodejs] | ||
== Enlaces Externos == | == Enlaces Externos == |
Revisión del 14:47 6 jun 2013
|
Node.js .Es una plataforma de programación del lado del servidor, basado en el motor de JavaScript V8 de Google Chrome
¿Qué es Node.js?
Node.js es un entorno de programación en la capa del servidor basado en el lenguaje de programación Javascript, con I/O de datos en una arquitectura orientada a eventos, y basado en el motor Javascript V8. Fue creado con el enfoque de ser útil en la creación de programas de red altamente escalables, como por ejemplo, servidores web.
Node.js es una nueva tecnología que está cambiando la forma en que se construyen y escalan las aplicaciones web en tiempo real. Permitiendo crear aplicaciones robustas que consumen muchos menos recursos que las desarrolladas con otros lenguajes.
Node usa el motor de JavaScript V8 de Google: una maquina virtual (VM) tremendamente rápida y de gran calidad escrita por gente como Lars Bak, uno de los mejores ingenieros del mundo especializados en VMs. V8 es actualizado constantemente y es uno de los intérpretes más rápidos que puedan existir en la actualidad para cualquier lenguaje dinámico. Además las capacidades de Node para I/O (Entrada/Salida) son realmente ligeras y potentes, dando al desarrollador la posibilidad de utilizar a tope la I/O del sistema.
Node soporta protocolos [[TCP], DNS y HTTP.
¿Qué hace diferente a Node.js?
Una de las razones de la elección de Node.js para crear aplicaciones, es la baja latencia en tiempo real de aplicaciones. Siendo su rendimiento y velocidad muy superior.
La cantidad real de recursos que se utiliza es mucho más pequeño, y puede conseguir mucho más de menos servidores.
Node.js permite que sólo se asignen los recursos del servidor cuando se necesita usarlos, Todo el mundo quiere hacer aplicaciones mucho más poderosas – cosas como Google Instant y Facebook, soportar millones de usuarios en un montón de dispositivos en tiempo real. Estas son las expectativas que la gente tiene de las aplicaciones ahora.
El punto de Node.js es que es muy rápido, es muy fácil de escalar, y el aspecto Javascript significa que es más fácil de construir.
Características de Node.js
Node utiliza el motor de JavaScript que utiliza Google Chrome, pero tiene una particularidad que no tienen actualmente otras plataformas de programación basadas en JavaScript, y es que Node toma el JavaScript en ejecución del browser y lo mueve al servidor, ejecutando el código en el servidor y no en el browser del usuario. Esto le otorga la particularidad de que le permite a los desarrolladores crear el back-end de la aplicación (la parte de la app que se ejecuta en el servidor). En teoría Node permite al desarrollador crear aplicaciones tanto para su ejecución en el cliente (browser del usuario) como aplicaciones para que se ejecuten en el servidor.
Otras de las particularidades interesantes de Node es que es un sistema de tipo Event Driven (basado en eventos) y es asincrónico. Esto significa que Node responde a eventos (un mandato del usuario o un mensaje de otra aplicación) y no a threads o hilos de ejecución (un thread es una tarea que se ejecuta paralelamente con otra tarea en el sistema operativo). Esta forma de operar le permite a Node funcionar de manera que no tiene que esperar a que una tarea termine para comenzar otra. Por ejemplo si pide información a una base de datos, puede ejecutar otra tarea sin necesidad de esperar a que la base de datos le retorne la respuesta a su petición.
¿Qué diferencias tiene respecto a Apache u otros servidores web?
Apache crea un nuevo hilo por cada conexión cliente-servidor. Esto funciona bien para pocas conexiones, pero crear nuevos hilos es algo costoso, así como los cambios de contexto. Como vemos en la siguiente gráfica, a partir de 400 conexiones simultáneas, el número de segundos para atender las peticiones crece considerablemente. Podemos decir que Apache funciona bien pero no es el mejor servidor para lograr máxima concurrencia (tener el número mayor de conexiones abiertas posibles).
Uno de los puntos fuertes de Node es su capacidad de mantener muchas conexiones abiertas y esperando. En Apache por ejemplo el parámetro MaxClients por defecto es 256. Este valor puede ser aumentado para servir contenido estático, sin embargo si se sirven aplicaciones web dinámicas en PHP u otro lenguaje es probable que al poner un valor alto el servidor se quede bloqueado ante muchas conexiones -esto dependerá del trabajo que la aplicación web de al servidor y de su capacidad hardware-.
Una aplicación para Node se programa sobre un solo hilo. Si en la aplicación existe una operación bloqueante (I/O por ejemplo), Node creará entonces otro hilo en segundo plano, pero no lo hará sistemáticamente por cada conexión como haría Apache. En teoría Node puede mantener tantas conexiones como número máximo de archivos descriptores (sockets) soportados por el sistema. En un sistema UNIX este límite puede rondar por las 65.000 conexiones, un número muy alto. Sin embargo en la realidad la cifra depende de muchos factores, como la cantidad de información que esté la aplicación distribuyendo a los clientes. Una aplicación con actividad normal podría mantener 20-25.000 clientes a la vez sin haber apenas retardo en las respuestas.
Un inconveniente de Node es que debido a su arquitectura de usar sólo un hilo también que sólo puede usar una CPU. Un método para usar múltiples núcleos sería iniciar múltiples instancias de Node en el servidor y poner un balanceador de carga delante de ellos.
Utilización de Node.js
Node puede ser utilizado para desarrollar aplicaciones que manejen altos volúmenes de conexiones con otros sistemas. En este tipo de aplicaciones los tiempos de respuesta bajos marcan una delgada línea entre el éxito o fracaso.
Node es especialmente bueno en aplicaciones web que necesiten una conexión persistente con el navegador del cliente. Mediante una serie de técnicas llamadas Comet, puedes hacer una aplicación que envíe datos al usuario en tiempo real; es decir, que el navegador mantenga la conexión siempre abierta y reciba continuamente nuevos datos cuando los haya. Para servidores y aplicaciones clásicas que no estén preparadas para mantener muchas conexiones, la forma más sencilla es solicitar desde el navegador un cada X segundos nueva información (polling). Si tenemos muchos usuarios a la vez abriendo conexiones y haciendo peticiones a la BD nos encontramos con que nuestro servidor no da más de sí y deja de atender peticiones -acaba petando, vamos-. Un ejemplo de polling clásico es la fisgona de Menéame que realiza peticiones mediante AJAX a un script PHP que devuelve nuevos datos en JSON cada 3 segundos y actualiza la tabla de novedades.
Una lista de aplicaciones para las que Node encajaría perfectamente:
- Juegos online.
- Gestores de correo online: de esta manera teniendo el navegador abierto podríamos ver notificaciones en tiempo real de nuevos correos recibidos.
- Herramientas de colaboración.
- Chats.
- Redes sociales: por ejemplo para actualizar automáticamente tu muro de novedades.
- Herramientas de traducción en tiempo real.
Futuro
Node.js se ha convertido en una tecnología interesante, accesible y eficiente para aplicaciones en tiempo real, que cada vez utilizan más empresas para desarrollar proyectos escalables, de gran rendimiento y que permiten optimizar los costes en servidores.
Por su naturaleza, Node está siendo adoptado tanto para el desarrollo de aplicaciones móviles como para la nube (cloud) de Internet. Gigantes como Microsoft (que acaba de integrar Node a su nube Azure) estan adoptando esta tecnología emergente.
Una muestra de su auge es que Node está siendo auspiciado por Microsoft, eBay, LinkedIn y Yahoo.
La posibilidad de utilizar JavaScript en el servidor permite añadir nuevas funcionalidades y superar nuevos retos dentro de la programación Web. Pero Node.js es mucho más. Es un lenguaje que ha rediseñado la programación orientada a redes para adaptarla a la Web moderna, donde una aplicación puede leer y escribir datos desde diferentes sitios y trabajar con millones de usuarios.
Node.js está centrada en la velocidad y en la escalabilidad. Es capaz de trabajar con miles de usuarios de forma simultánea sin requerir una fuerte inversión en hardware. Node.js cuenta con miles de seguidores y compañías como eBay, LinkedIn y Microsoft ya trabajan con él.
Ejemplos
El tipico (hello_world.js):
console.log('Hello world');
Un servidor HTTP básico
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("Hola Mundo"); response.end(); }).listen(8888);
El código anterior crea un servidor http básico esperando a servir peticiones en el puerto 8888.
Fuentes
- http://www.maestrosdelweb.com/editorial/¿que-es-javascript/
- http://nodejs.org/
- http://debuggable.com/posts/understanding-node-js
- http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8
- http://nodejs.org/jsconf.pdf
- http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests
- http://www.quora.com/Whats-the-difference-between-an-event-loop-and-a-per-request-model
- http://stackoverflow.com/questions/3011317/node-js-or-erlang
- [1]
- http://stackoverflow.com/questions/3878096/nodejs-nodejs-org-experience-comments
- http://www.olympum.com/future/nodes-and-jetties
- http://stackoverflow.com/questions/5062614/how-to-decide-when-to-use-nodejs