-->
Javascript del lado del servidor usando Node.js
Daniel Aristizabal Romero [cronopio]
Nodejitsu Inc.
¿Qué es Node.JS?
Entorno de programación orientado a eventos[1], pensado para construir programas de red rápidos y escalables,
con modelos de entrada/salida sin bloqueo[2]que hacen liviano y eficiente el entorno. Perfecto para
aplicaciones en tiempo real y de datos intensivos.
JavaScript en Server - Side
Construido sobre V8 (el motor de JS de Chrome)
Orientado a eventos
Sistema de modulos CommonJS
Core escrito en C++, libreria estandar escrita en JS
En 2009, 14 desarrolladores del core. Hoy 533
En la industria.
Compañias un poco menos conocidas...
ESPERA!!
¿JS en Server-side?
WTF?!
Si!, Gracias a V8
y a Joyent ;)
Bloqueo de I/O
Muchas aplicaciones web tienen código como este:
var $r = db.query('select * from T');
// puedo usar el $r
echo $r
¿Y qué hace el software mientras se hacen las consultas a la base de datos?
En la mayoría de casos...
sólo esperar la respuesta.
Non-blocking de I/O
En el mundo de javascript el código luciría algo como:
db.query('select * from T', function (r) {
// puedo usar el r
alert(r);
});
// el flujo del programa sigue
alert('Hola Mundo');
El buen software puede ser
multi-tarea.
Otros hilos de ejecución pueden correr mientras esperan.
¿Es lo mejor que podemos hacer?
Apache vs Nginx
Memoria RAM vs Conexiones Concurrentes
Apache vs Nginx
¿La diferencia?
- Apache usa un hilo por conexión.
- Nginx no usa hilos. Usa un bucle de eventos (event loop).
- Los cambios de contexto no son gratis.
- Las pilas de ejecución de tareas requieren memoria.
- Para concurrencia masiva, no se puede usar un hilo del sistema operativo por cada conexión.
- La concurrencia usando hilos, es una abstraccion con fugas.
Concurrencia de hilos
Código como este:
var r = db.query('select * from T');
Bloquea el proceso entero o implica la ejecución de pilas de tareas.
Concurrencia por Eventos
Pero código como este:
db.query("select ...", function(r) {
// uso el r
});
Permite al programa regresar al bucle de eventos inmediatamente.
... y no necesita nada más.
Asi es como debe hacerse la entrada/salida (I/O)
...mmm ¿bucle de eventos?, me suena a...
JavaScript!
JavaScript
JavaScript esta especialmente diseñado para ser usado como un bucle de eventos (event loop):
- Funciones anónimas, closures.
- Solo un callback al mismo tiempo.
- Entrada/Salida (I/O) a través de eventos en el DOM.
- La cultura del JavaScript normalmente usa programación orientada a eventos.
“Un lenguaje que no tenga todo,
es realmente fácil programarlo para que lo haga todo.”
– Dennis Ritchie
Stack
Instalación.
(en gnu/linux)
Instalación
Dependencias:
- python (recomendado 2.6, solo necesario cuando se compila)
- libssl-dev (si deseas usar SSL/TLS)
Instalación
Debian:
root@host: ~ # echo deb http://ftp.us.debian.org/debian/ sid main > /etc/apt/sources.list.d/sid.list
root@host: ~ # apt-get update
root@host: ~ # apt-get install nodejs npm
### Opcional (y obligatorio para algunos modulos)
root@host: ~ # apt-get install build-essential # Herramientas de compilación
root@host: ~ # apt-get install nodejs-dev # Codigo de nodejs
Ubuntu:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs npm
### De nuevo, opcional (y obligatorio para algunos modulos)
sudo apt-get install build-essential # Herramientas de compilación
sudo apt-get install nodejs-dev # Codigo de nodejs
Instalación
Para mas distribuciones y/o sistemas operativos revise la wiki de node.
¿Windows?
Para Windows cada vez son mas grandes los esfuerzos para que funcione bien, pero node.js
tiene algunos principios bastante ligados con los Unix modernos.
¿MacOSX?
Instalación
Descargando las fuentes:
Usando Git.
git clone git://github.com/joyent/node.git
cd node/
git checkout v0.6.15
Descargando un tarball.
wget -c https://github.com/joyent/node/tarball/v0.6.15 -O node-0.6.15.tar.gz
tar zxvf node-0.6.15.tar.gz
cd joyent-node-d90d46f/
Instalación
Construcción:
Como usuario sin privilegios.
mkdir ~/local
./configure --prefix=~/local
make -j2 # dependiendo del numero de cores.
make install
echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Como root.
su -
./configure
make -j2 # dependiendo del numero de cores.
make install
Instalación
Node Package Manager (NPM)
curl http://npmjs.org/install.sh | sh
Instalando módulos o paquetes.
de manera local
npm install express
de manera global
npm install -g express
Ecosistema de Módulos
O usando CLI (9101 paquetes registrados.)
npm search hook.io # tema o tag a buscar
Paquetes más usados.
Ecosistema de Módulos
El node-toolbox es un sitio donde podemos encontrar los paquetes registrados en NPM ordenados por categorías. También tiene links a sitios de interés y listados por popularidad de paquetes. La aplicación está desplegada en lasSmart Machines de Joyent y su url es:toolbox.no.de
El wiki de node tiene un listado de módulos compatibles con node.js.
Listado de modulos de node.js ordenados por su ranking.
Socket TCP
Servidor
Cliente
telnet localhost 8000
Consulta de dominios.
Servidor
Cliente
telnet localhost 8000
ip fcbosque.org
salir
Servidor Web
Servidor
Cliente
http://localhost:4000/
Gracias!!
Daniel Aristizabal Romero
Laboratorio Tecnológico Fundación Casa del Bosque
←→/