Nuevo enfoque para estudiar un nuevo lenguaje: Node.JS

Llevo casi una semana dedicado a leer libros y artículos sobre Node.JS, por si aún no lo conoces es javascript para ejecutar en tu máquina o en un servidor, no en tu navegador. Está basado en el motor de javascript de google V8, al que le han añadido módulos para el soporte de características que quedaban cojas para aspirar a lenguaje de propósito general, mejorado otras y quitando cosas como el soporte DOM.

Uno de los módulos fundamentales es que puedes lanzar un servidor de red para dar servicio de lo que se te ocurra: http, ftp, un chat, un servicio inventado, etc., sin necesidad obligatoria de utilizar por ejemplo un servidor web para http como apache o nginx.

Node.JS

¿Cómo abordaba anteriormente un nuevo lenguaje?

Hasta ahora cuando estudiaba un nuevo lenguaje prácticamente lo abordaba con algún proyecto y a tirar líneas con el google a mano. Como mucho algún cheatsheet al principio para conocer lo más básico, pero sin conocer realmente el lenguaje.

Es frustrante ir tan lento al estar buscando varias veces la forma de trabajar con ficheros, los arrays, las llamadas al sistema, modificar cabeceras http, el acceso a bases de datos, etc. Y si encima el lenguaje tiene una sintaxis caótica como PHP, no te cuento más.

Esto lleva a perderte aquellas características que hacen diferente al lenguaje, perdiendo muchas oportunidades de hacer un código más eficiente aprovechando mejor lo que te ofrece el lenguaje.

Libros

¿Cómo lo estoy abordando ahora?

En esta ocasión, aprovechando los días de vacaciones, he buscado libros que no me cuenten la instalación, el hola mundo y luego meterse de lleno en la sintaxis.

He huido de ellos por ahora y estoy leyendo aquellos que hablan más de la filosofía de NodeJS, cómo funciona internamente y cuales son su cualidades. Esto finalmente me ha llevado con NodeJS releer cosas como la programación funcional, las funciones lambda y closures, ahora ya desde otra óptica más útil.

Con un estudio previo evitas enterarte demasiado tarde de cosas básicas en Node como es la gestión de los eventos, el event loop, etc. y sobre todo, sobre todo:

  • La ejecución asíncrona de todas las funciones bloqueantes como son los accesos a red, disco, etc.
  • El hilo único de ejecución, conociendo esto puedes plantearte una mejor estrategia para programar.
  • Cuidar el hacer llamadas asíncronas que deban tener un cierto orden de ejecución.
  • No entrar en un anidamiento profundo de llamadas anónimas, para ello utilizar funciones con nombre para hacer el código legible y mantenible en el futuro.
  • Un enfoque de programación paralela basado en eventos.

¿Qué hacer con Node.JS?

Por ahora veo un potencial muy bueno para gestionar servicios en red por ejemplo, programar APIs online, servicios REST, en general servicios de petición de recursos.

Empleando el esquema de ejecución asíncronas, diferentes peticiones pueden llevarse a cabo en paralelo. Un ejemplo:

Mientras una petición permanece bloqueada a la espera de la finalización de lectura de base de datos, el servidor puede ir atendiendo nuevas solicitudes o sirviendo el resultado de otras peticiones. Cuando los datos llegan, un evento levanta la petición bloqueada llamando a la función callback correspondiente que trata y devuelve la respuesta.

¿Y es rápido como el rayo?

En un esquema tradicional con un servidor web tipo worker, el hilo que atiende la petición permanece bloqueado (no atiende una nueva petición) hasta que la operación de disco, red o base de datos no ha finalizado y haya podido tratar la respuesta.

Aunque Apache ya tiene otro tipo de hilos de ejecución más optimizados, la llamada al backend que ejecuta el servicio normalmente mantendrá bloqueado y ocupado el proceso que espera la operación externa, no atendiendo otra petición.

Me gustaría hacer pruebas de rendimiento con un servicio, pero eso será cuando tenga más tiempo. El esquema de programación basado en eventos con NodeJS tiene un buen rendimiento con las llamadas asíncronas no bloqueantes. Un ejemplo lo tenemos con nodecached donde Álex Fernández nos demuestra hasta donde llega la velocidad de Node.JS.

En el caso de sitios muy ocupados una forma de crecer es amplianto el número de hilos de ejecución y por tanto la memoria y/o más CPU. Con node podemos atender con un solo hilo muchas más peticiones y llegados al límite atender más peticiones creando nuevos hilos con el módulo cluster, aún en modo experimental, o creando otro servidor en otro puerto o IP.

Node no será eficiente si tiene que atender ejecuciones muy largas o de forma síncrona debido a su único hilo de ejecución, aunque puede utilizarse exec() o spawn() para lanzar en otro hilo una ejecución más lenta o llamadas externas.

Continuará...

Aún me queda por aprender y eso será cuando programe en serio. Ahora viene muy bien conocer más en profundidad el modo de funcionamiento de lo que tienes entre manos, las cosas mágicas son muy difíciles de controlar.