2011/07/07

Introducción a Node

No es un secreto que siempre me han atraido las aplicaciones en tiempo real, pero desgraciadamente en el desarrollo web, la comunicación bidireccional de la información para realimentarse de los datos siempre ha sido con suerte artificiosa.

Afortunadamente, HTML5 ha venido al rescate de todos con la maravillosa implementación de los websockets... pero toda moneda tiene su revés... ningún servidor web soporta el protocolo de websockets, y no solo eso, si no que además, dicho soporte es poco menos que ciencia ficción porque el modelo de funcionamiento de los servidores web basado en petición-respuesta es incompatible con el modelo de funcionamiento de los websockets basado en eventos.

Vamos a matizarlo un poco... poderse, se puede... pero el rendimiento es para echarse a llorar. Existe el paradigma de las 10k conexiones que dice que un servidor web debe ser capaz de servir a 10000 clientes simultáneos. Alguno dirá que 10k conexiones son una barbaridad, pero hay que tener en cuenta que con websockets los eventos tienen una vida muy corta y se pueden realizar muchos por cada página, con lo que poniendo una media de 10 conexiones por página nos da un total de 1000 clientes reales... y si es una página que tiene mucho tráfico, pues nos encontraremos con problemas muy rápido.

La única solución que nos queda es montar un nuevo servidor web dedicado únicamente a websockets y que sea capaz de cumplir con el 10k. A día de hoy hay varias alternativas, unas comerciales y otras libres, pero la mejor sin duda (al menos para mí) es Node.js.

Qué es Node.js? pues aunque cueste creerlo es un servidor de websockets basado en javascript (comorl???). Pues sí, y como muestra la gráfica de pruebas de stress a continuación, se lleva de calle a cualquier otra plataforma.

Para los que tengan curiosidad, la línea verde es Apache sobre Ubuntu que se ve claramente que no llega ni a las 1000 conexiones concurrentes mientras que Node sobrepasa ampliamente las 10k hasta las casi 14k con la misma máquina.

Ahora vienen las pegas ya que tono no es un campo de flores. La programación orientada a eventos es radicalmente diferente en concepto a la procedimental de toda la vida... ergo, tendremos que aprender a programar de nuevo.

Node se basa en el último motor de javascript + una librería de acceso de entrada salida asíncrona así que el concepto de páginas y carpetas se sustituye por otro parecido a servicios o puertas de entrada. Cada servicio de node será un servidor en sí escuchando en un websocket, listo para responder a los eventos que le lleguen.

El servicio usado para las pruebas de carga es éste, que es un respondedor automático que dice "Hello world" a todas las peticiones después de 2 segundos.

node.http.createServer(function (req, res) {
  setTimeout(function () {
    res.sendHeader(200, {"Content-Type": "text/plain"});
    res.sendBody("Hello World");
    res.finish();
  }, 2000);
}).listen(8000);
puts("Server running at http://127.0.0.1:8000/");

Lo que hace es escuchar el puerto 8000 y responde usando el protocolo http con el texto.

El truco es que al contrario que los servidores tradicionales, en esos 2 segundos (simulación del proceso que tendría que hacer), el servidor sigue aceptando petic... err... eventos y no bloque la ejecución.

Más de uno estará echando de menos librerías para acceso a base de datos (gracias PHP!) ya que aquí solo hay un esqueleto de aplicación sin demasiados añadidos aparte de leer y escribir.

Las buenas noticias son que hay múltiples librerías que utilizando el protocolo TCP/IP son capaces por ejemplo de atacar a servidores MySQL y ejecutar las operaciones necesarias para consultar, insertar, modificar, etc.

Otro ejemplo típico es un chat, que afortunadamente viene de "serie" como ejemplo con su código fuente aquí.

Para montar el servidor, necesitamos un hospedaje LINUX que permita instalarlo o un hospedaje gratuito de Node como por ejemplo Joyent. Para montarlo en casa, seguiremos necesitando linux y descargar los fuentes para luego compilarlos con
./configure
make
make install
La documentación, la podéis encontrar en esta dirección y la mailing list es ésta otra.

Para los que tengan curiosidad, se mantiene una lista de los módulos actualmente implementados en esta dirección que hacen ver que es un proyecto que está pero que muy vivo.

No hay comentarios:

Publicar un comentario