He comenzado un nuevo proyecto en mi trabajo en el que requiero el empleo de NodeJS. Ya había oído hablar de esta tecnología y probado pequeños ejemplos para conocer superficialmente el concepto, sin embargo ahora entro en mayor profundidad en su conocimiento y quiero compartir con vosotros mi comienzo con esta tecnología.
¿Cómo he comenzado con NodeJS?
El proyecto trata de una aplicación web cliente totalmente desarrollada con tecnologías ligeras (HTML5+CSS3+JS) la cual recibe a través de websockets información proporcionada por un servicio que corre sobre NodeJS. A través de una librería de manejo de Sockets para NodeJS (Socket.io) la parte servidor escucha sobre el puerto serie de la máquina, para leer información de unos NFC controlados por un Arduino.
Mis límites se encuentran del puerto serie hacia el servidor, que tras leer los datos envío la información necesaria a la aplicación a través de websockets evitando el empleo de técnicas como long polling y de esta manera actualizando los estados de la aplicación en función de la información recibida. Además esta comunicación es bidireccional pues la parte cliente también escribe sobre el websocket para comunicar información al servidor y que este realice las acciones necesarias.
¿Como funciona NodeJS?
NodeJS se define como un intérprete Javascript del lado del servidor que cambia el concepto de cómo trabaja un servidor tal como lo conocemos. El objetivo principal de node es el de desarrollar aplicaciones escalables que acepten una gran carga de peticiones en una única máquina física. El código desarrollado corre sobre el motor V8 de Javascript desarrollado por Google y diseñado para ejecutarse en un navegador de una forma bastante eficiente y rápida
Las tripas de NodeJs permiten interpretar en el lado del servidor código javascript junto a un conjunto amplio de librerías básicas que nos proporcionan gran funcionalidad. Se han descartado ciertas funcionalidades nativas de javascript que no tenían sentido en este entorno como el manejo del DOM.
NodeJs ejecuta un único hilo encargado de organizar los workflows y encargado de gestionar distintas tareas de una forma totalmente asincrona. Esta tecnología delega todo el trabajo a una piscina de hilos que permite el empleo multitarea asíncrono y gestionando el tiempo de una forma totalmente eficiente y pudiendo implementar manejadores para todos los eventos.
En otras arquitecturas como aplicaciones web PHP corriendo sobre Apache cada conexión consume una pequeña parte de los recursos de la maquina. El problema de la eficiencia de estas arquitecturas es cuando una gran cantidad de usuarios recurrentes consumen estos recursos hasta acabar con los recursos teniendo que escalar horizontalmente añadiendo más maquinas que puedan dar servicio a la multitud de peticiones simultaneas.
Sin embargo NodeJS cuenta con su propio servidor manteniendo una única instancia del mismo gestionando eficientemente los recursos y las respuestas a conexiones simultaneas y ofreciendo un gran rendimiento. NodeJS no tiene dependencia sobre un servidor web concreto pues la propia tecnología hace de aplicación y servidor web, además de mantener conexiones persistentes para intercambiar datos el cliente y el servidor, a contra posición de las arquitecturas tradicionales en las que el cliente siempre es el que realiza peticiones al servidor cerrando la conexión por cada petición.
¿Donde se debería usar NodeJS y que problemas resuelve?
La gran ventaja de emplear NodeJS es que es código javascript de tal manera que la curva de aprendizaje no es demasiado alta si ya estás habituado a las tecnologías web, además de tener una API sencilla de aprender y modularizada. Al final esta tecnología se desarrollo para construir software de red más escalable y con un gran número de conexiones concurrentes, por eso hay que plantearse si nuestro desarrollo puede llegar a cumplir esta serie de condiciones.
Esta herramienta está diseñada para esperar una gran cantidad de tráfico donde la lógica implementada en el servidor y el procesmiento no sean demasiado pesados ni complejos. Entre los modelos que encajarían para el empleo de esta tecnología se encuentran:
- El desarrollo de una API REST puede ser una situación ideal en la que se solicita una cierta cantidad de información que puede ser requerida por miles de usuarios.
- Aplicaciones en tiempo real como gestores de correo, herramientas de monitorización o herramientas colaborativas
El tipo de preguntas que uno debe plantearse ántes de usar node son las siguientes
- ¿Son importantes los tiempos de respuesta bajos y la alta concurrencia con el cliente?
- ¿El número de usuarios activos va a ser considerablemente alto?
Modulos en Node js
NodeJS incluye un gestor de maquetes llamado NPM (Node Package Manager) el cual nos aporta una gran cantidad de extensiones que añadir como la gestión de websockets, la gestión de logs, frameworks de desarrollo web, comunicaciones con puerto serie. Igual que ocurre con otras tecnologías existe una gran comunidad de tras que hace crecer el número de librerias/paquetes disponible que mejoraran en gran medida el producto siendo una parte esencial en el desarrollo de aplicaciones en NodeJS. La propia wiki de Node.js proporciona una lista de varios de los módulos de terceros disponibles a través de este gestor.
Sin embargo a parte de su extensibilidad la tecnología incluye módulos básicos para gestionar Paths, el Sistema de Ficheros, generación de Buffers y Timers, Streams de datos…
Ejemplo de código
Sin embargo vamos a ver la parte que todos deseamos, el código fuente de como se implementa todo lo que hemos estado comentando. En este ejemplo se puede ver la generación de un servidor web que lee en el puerto 8000 al cual se le sirve un contenido en texto plano, un bonito y educado ¡Hola Mundo!
1 2 3 4 5 6 7 8 |
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hola Mundo\n'); }).listen(8000); console.log('Servidor corriendo en http://localhost:8000/'); |
Para concluir con este arituclo, debo recomendar la siguiente lista de reproducción del gran Jesus Conde en la que detalla a través de 30 tutoriales las posibilidades del empleo esta tecnología y además intentaré escribir próximamente nuevos artículos relacionados con las posibilidades que nos aporta NodeJS.