Node.js y el Event Loop

Una de las razones que ha hecho popular a Node.js es su extraordinaria velocidad de respuesta en comparación con un servidor Java (por ej. Tomcat). Obviamente esto no se consigue gratis, y es que a diferencia de un servidor Java, Node.js es “single threaded” solo hay un hilo de ejecución atendiendo todas las peticiones, no se levanta uno nuevo cada vez. Esto elimina toda la sobrecarga de gestión de los hilos (locks y demás).

Pero para que esto funcione las aplicaciones tienen que ser programadas de forma que no se bloqueen en tareas lentas como una consulta a la red, un acceso base de datos o a un fichero. Es por ello que la programación asíncrona está en el fundamento de Node.js. Node.js es una apuesta a que un solo hilo con procesado asíncrono tiene mejor rendimiento y escalabilidad que una implementación multi-hilo.

Programación síncrona

Node.js se apoya en un motor de ejecución javascript como el que contiene cualquier navegador. Este motor es el que es single-threaded, y en el navegador es la razón de que si tienes una página y tu código realiza varias llamadas de red síncronas que tardan mucho, acabes con una página que se queda bloqueada y donde no puedes hacer click en ningún sitio.

Es el mismo problema que tenemos en Node.js si hiciéramos muchas llamadas síncronas costosas (base de datos, ficheros, red). No habría respuesta hasta finalizadas todas las tareas.bloqueos_node

La forma de evitar los bloqueos es con programación asíncrona y en un navegador como Chrome esto es posible porque aparte del hilo de ejecución del motor javascript hay otros hilos de gestión. Entre ellos el famoso Event Loop. ¿Cómo funciona?

Programación asíncrona y el Event Loop

Cuando se ejecuta un código javascript en una página, de forma síncrona, usa la pila de llamadas del motor. Los métodos invocados se van apilando y desapilando y solo se devuelve el control al navegador cuando la pila se vacía. En este modo síncrono, si hay tareas que tardan mucho, podemos vernos con que la página se “congela” durante un buen rato.

callstack_sincrono

Si realizamos tareas de forma asíncrona, como cuando invocamos el API setTimeOut pasando una función de callback y un retardo, esta es ejecutada por un hilo independiente del navegador, fuera de la pila de Javascript. Cuando termina de ejecutarse la función de callback queda en una cola, a la espera de poder ejecutarse.

callstack_asincrono

¿Cuando se ejecuta la función de callback? En cuanto la pila se libera otro hilo de gestión del navegador, el famoso Event Loop, coge la función para meterla en la pila.

Por todo lo anterior es que se usa ese truco de llamar a funciones pasándolas a setTimeOut con delay 0. Las funciones no se ejecutan directamente, sino que acaban en una cola, y el loop irá pasándolas a la pila cada vez que se vacíe. En esos huecos en medio la página responde a nuestras acciones, no está bloqueada. Provocamos asincronía y creamos páginas mas dinámicas.

APIs asíncronas como setTimeOut hay muchas: para llamadas en red, consulta de almacenes de datos, etc.

Node.js resuelve la programación asíncrona como hemos descrito antes para el navegador. Y es que Node.js usa el motor javascript en que se basa Chome, y los procesos de gestión alrededor del motor son como los que usa el navegador.

chromeVer también:

Test plugin wp-gnusocial

Esto es un test del plugin wp-gnusocial. Permite usar gnusocial como plataforma de comentarios a partir de la publicación de un post. Los comentarios aparecen tanto en gnusocial como en wordpress. El plugin todavía en pruebas >> git://enkidu.coop/wp-gnusocial.

Si todo va bien este post aparecerá publicado en liberakampo.org …

 

Unete a la federación con GNU-Social

Esta semana he instalado un sitio de microblogging con gnu-social donde queremos cacharrear y aprender. Lo he llamado Libera Kampo. Si os suena raro es porque quereis ;-). Es Esperanto  y es sencillo de aprender.

GNU-Social es un software de redes sociales de código abierto y gratuito. Básicamente te permite crear tu propia red social dedicada a lo que desees y que esta a su vez forme parte de una red mas extensa compuesta por todos los nodos GNU-Social que existen en el mundo. Desde un nodo puedes tener conversaciones con la gente registrada en ese nodo o también con personas registradas en otros.

gnu

Continúa leyendo Unete a la federación con GNU-Social

De la pizarra a la base de datos –> Neo4j

He de confesar que quizá no sea muy objetivo a la hora de comparar una base de datos orientada a grafos con otras NoSQL. Para aprender algo nuevo suelo visualizar relaciones, y en general tiendo a fijarme menos en los detalles y mas en que papel cumplen unas cosas respecto a otras.

un grafo

Y resulta que estos almacenes de datos me dan lo que me gusta, su foco está puesto en las relaciones, y de forma muy sencilla puedo convertir el dibujito de cajitas y flechas que tengo en la cabeza en una base de datos real. Apenas hay un salto o traducción.

Continúa leyendo De la pizarra a la base de datos –> Neo4j

Humongous Mongo

Parece ser que el nombre de Mongo DB se deriva del término humongous que viene a significar algo así como “enorme” o “monstruoso”, quizá por su habilidad para tratar grandes cantidades de datos y peticiones. Yo, la primera vez que oí este nombre pensé en el planeta Mongo de los comics de Flash Gordon :-P Ejemplos de lugares donde se usa Mongo son Foursquare, Bitly o el CERN para almacenar los datos del LHC.

flash-gordon-mapa-mongo

Esta BD open source NoSQL, es de las llamadas “documentales”. En una base de datos relacional cada cliente en una tabla de clientes, tiene siempre los mismos campos, nombre, apellidos, dni… en una BD documental, hoy un cliente de la colección clientes tiene quizá 10 campos, si el mes que viene nos damos cuenta de que los nuevos clientes necesitan 12, no hay problema, simplemente insertamos los nuevos con 12 campos. Es una BD sin un esquema que restrinja (o garantice) una estructura. Más libertad para el usuario, pero también más responsabilidad.

Continúa leyendo Humongous Mongo

¿Por qué el disco que tienes en tu casa no vale para Big Data?

Después de todo, pongamos, 100 millones de registros pueden ser unos 100 GB y caber perfectamente en cualquier disco duro externo. Si, el pequeño que enganchas a tu portátil por USB.

La información que guarda Google de sus usuarios para algunas de sus aplicaciones es del orden de terabytes, pero vamos, eso cabe en la palma de tu mano hoy en día.

Continúa leyendo ¿Por qué el disco que tienes en tu casa no vale para Big Data?