Node.js: ¿Qué es y para que sirve NodeJS?

Tecnología Web, , Con 12 comentarios

NodeJS es un código abierto de JavaScript (razón por la cual se incluye el distintivo JS) que está diseñado para generar aplicaciones web de forma altamente optimizada. Desde su nacimiento hacia el año 2009 ha logrado convertirse en todo un must dentro del desarrollo web. Pero ¿qué es exactamente y para qué se utiliza?

¿Qué es y para que sirve node.js?

JavaScript es un sólo un lenguaje de programación del lado del cliente que se ejecuta en el navegador, ¿verdad?. Ahora ya no. Node.js es una forma de ejecutar JavaScript en el servidor, además de mucho más. Node.js es un entorno Javascript del lado del servidor, basado en eventos. Node ejecuta javascript utilizando el motor V8, desarrollado por Google para uso de su navegador Chrome. Aprovechando el motor V8 permite a Node proporciona un entorno de ejecución del lado del servidor que compila y ejecuta javascript a velocidades increíbles. El aumento de velocidad es importante debido a que V8 compila Javascript en código de máquina nativo, en lugar de interpretarlo o ejecutarlo como bytecode. Node es de código abierto, y se ejecuta en Mac OS X, Windows y Linux.

Node.js es una librería y entorno de ejecución de E/S dirigida por eventos y por lo tanto asíncrona que se ejecuta sobre el intérprete de JavaScript creado por Google V8. Lo cierto es que está muy de moda aunque no es algo nuevo puesto que existen librerías como Twisted que hacen exactamente lo mismo pero si es cierto que es la primera basada en JavaScript y que tiene un gran rendimiento.

Nodejs.es

La escalabilidad como uno de sus objetivos principales

Node.js fue formulado para generar una sistema escalable y que tuviese la consistencia suficiente como para poder generar un elevado número de conexiones de forma simultánea con el servidor. Generalmente cuando se crea un gran número de conexiones el rendimiento y la velocidad de las aplicaciones y páginas web se ven perjudicados. Esto se debe a que la gran mayoría de tecnologías que trabajan desde el lado del servidor accionan las peticiones de forma aislada y mediante hilos independientes. Por eso, cuando la cantidad de solicitudes que se hacen van en incremento, los recursos y el consumo de los mismos también se incrementan. A este tipo de limitaciones que se generan en el propio servidor también es necesario sumar todas aquellas que posee el cliente (desde la velocidad de su conexión a internet o la memoria RAM de su dispositivo por ejemplo). La cantidad de solicitudes así como los procesos entrantes y salientes se convierten en uno de los factores limitantes y Node.js ha sido concebido para optimizar este handicap.

Su propuesta se basa en el tratamiento de estas conexiones de forma unificada a partir de un único hilo complementado con un bucle de eventos (Event Loop) de tipo asíncrono. De este modo las peticiones que se vayan haciendo reciben un tratamiento en forma de eventos y pertenecen a este único bucle. Por este motivo los rasgos de asincronía y el uso de eventos en JavaScript resulta tan interesante para los creadores de Node.js. Este nuevo replanteamiento proporciona un lenguaje con la capacidad de gestionar una gran cantidad de solicitudes y conexiones con la máxima eficiencia. No es extraño entonces que se haya convertido en una de las alternativas más utilizadas por todo tipo de desarrolladores y aplicaciones que requieren la gestión de una gran cantidad de conexiones simultáneas. Algunos ejemplos son aplicaciones que se basan en las notificaciones push como ZaroMQ o aquellas que realizan solicitudes de forma constante a servicios como Ajax. Sin embargo, Node.js no es la alternativa más recomendable si vamos a trabajar en APPS que no hagan apenas solicitudes.

Operaciones asíncronas

Un servidor se encarga de ejecutar diferentes tareas para facilitar la comunicación con los diferentes clientes. Estas tareas se aglutinan bajo las siglas I/O que hacen referencia a aquellas que están destinadas a la entrada (input) y a la salida (output) de información. En los lenguajes clásicos de programación como Java este tipo de tareas se desarrollaban de una forma sincrónica. ¿Qué quiere decir esto? Que todas se ejecutaban de una forma lineal por lo que hasta que no se llevaba a cabo un proceso no se podía ejecutar el siguiente. Esto trae bastantes inconvenientes como por ejemplo el alargamiento innecesario de los procesos de trabajo y la tendencia a que se produzcan bloqueos. Sin embargo NodeJS emplea un I/O de tipo asíncrono. Esto significa que todas las tareas que se desarrollan por el servidor se hacen de forma paralela por lo que pueden efectuarse de forma simultánea y sin que se produzca ningún tipo de bloqueo en el flujo de trabajo. El resultado es una ventaja competitiva considerable que proporciona a la arquitectura de las aplicaciones web una mayor potencia y velocidad de procesamiento.

Además de la alta velocidad de ejecución de Javascript, la verdadera magia detrás de Node.js es algo que se llama Bucle de Eventos (Event Loop). Para escalar grandes volúmenes de clientes, todas las operaciones intensivas I/O en Node.js se llevan a cabo de forma asíncrona. El enfoque tradicional para generar código asíncrono es engorroso y crea un espacio en memoria no trivial para un gran número de clientes(cada cliente genera un hilo, y el uso de memoria de cada uno se suma). Para evitar esta ineficiencia,así como la dificultad conocida de las aplicaciones basadas en hilos, (programming threaded applications), Node.js mantiene un event loop que gestiona todas las operaciones asíncronas.

Cuando una aplicación Node.js necesita realizar una operación de bloqueo (operaciones I/O como trabajo con archivos …etc) envía una tarea asíncrona al event loop, junto con un callback, y luego continúa.

Pero ¿por qué javascript del lado del servidor?

Aunque Javascript tradicionalmente ha sido relegado a realizar tareas menores en el navegador, es actualmente un lenguaje de programación totalmente, tan capaz como cualquier otro lenguaje tradicional como C++, Ruby o Java. Ademas Javascript tiene la ventaja de poseer un excelente modelo de eventos, ideal para la programación asíncrona. Javascript también es un lenguaje omnipresente, conocido por millones de desarrolladores. Esto reduce la curva de aprendizaje de Node,js, ya que la mayoría de los desarrolladores no tendrán que aprender un nuevo lenguaje para empezar a construir aplicaciones usando Node.js.

La importancia de los eventos en NodeJS

Su arquitectura se basa en eventos y gracias a ella es posible generar un tipo de procesamiento asíncrono de operaciones de entrada y salida. Está basada en un único hilo de procesos capaz de contener todos los eventos que se producen. A medida que se van produciendo eventos su sistema es capaz de trabajar con ellos a diferentes niveles mediante su función callback. De este modo, diferentes procesos no se desarrollarán en un mismo nivel. De este modo, aunque todos los eventos formen parte de un mismo hilo de procesos, se trabajará con ellos mediante funciones paralelas dentro del mismo bucle. Cuando una tarea en segundo plano se ejecuta la función “callback” resuelve la entrega del resultado y puede ser entregado al cliente en un tiempo muy reducido.

JavaScript como la base de su semántica

Para generar una conexión entre dos o más dispositivos lo más normal es que exista un elemento llamado servidor cuya función es mediar entre los diferentes usuarios que inician la conexión. Estos usuarios o clientes establecen una comunicación directa con el servidor y reciben una información que puede ser de cualquier tipo: Desde una página web a cualquier tipo de notificación o mensaje emitido por cualquier otro cliente.

Para gestionar y construir este tipo de conexiones existen diferentes tipos de lenguajes. Algunos de ellos se ejecutan directamente en el servidor (php es un ejemplo), mientras que otros se ejecutan del lado del cliente (por ejemplo JavaScript).

Sin embargo, NodeJS cambia esta situación ya que se trata de un lenguaje diseñado para ejecutar JavaScript desde el lado del servidor. Pero ¿por qué? Lo cierto es que JavaScript es un lenguaje muy extendido y utilizado por los desarrolladores lo cual hace que NodeJS se convierta en una alternativa sencilla y fácilmente digerible. Sin embargo, esta no es la principal razón, sino que los rasgos de JavaScript han llamado especialmente la atención de los creadores de Node. Por tratarse de un lenguaje asíncrono y orientado al diseño a partir de eventos podía ofrecer un enorme margen de maniobra.

Gestor de librerías Node Package Manager

Uno de los puntos fuertes de nodeJS es su Node Package Manager (un los paquetes NPM). Una especie de gestor que da acceso a un conjunto de librerías muy extenso que además son gratuitas y generadas a partir de la colaboración de los usuarios de su comunidad. Algunos de los paquetes más conocidos que podrás encontrar en su plataforma son React, Gulp, Browserify, Grunt-cli, Bower, Grunt, Express, Cordova o Forever. (Podrás obtener más información accediendo a su página oficial en npmjs.org).

¿Por qué utilizar NodeJS?

  1. Se trata de un lenguaje que puede utilizarse en la gran mayoría de servidores, incluyendo los más conocidos como Unix, Microsoft o Mac.
  2. Una buena parte de las plataformas más eficiente y mejor optimizadas de la red como por ejemplo Linkedin o Paypal fueron desarrolladas a partir de NodeJS, las cuales son fieles indicadores de calidad y potencialidad.
  3. Garantiza un elevado rendimiento. No sólo puede generar arquitecturas sólidas y potentes sino que además reduce de una forma muy drástica el ratio de errores.
  4. Al estar inspirado en JavaScript cuenta con una semántica muy fácil de digerir, aprender y aplicar por cualquier programador.
  5. Su alta capacidad de escalabilidad ha llevado el mundo de la programación a un nuevo nivel. Hoy en día los desarrolladores pueden generar aplicaciones potentes y con una capacidad escalable asombrosa. Pero, ¿esto en qué se traduce? En aplicaciones web con potencialidades sorprendentes como semánticas que permiten miles y miles de solicitudes a un único servidor de forma simultánea. Esto ha permitido multiplicar las capacidades de las aplicaciones web que hasta entonces podían soportar hasta un máximo de cuatro mil usuarios por servidor. Sin embargo NodeJS ha permitido multiplicar la capacidad para alojar usuarios activos en las aplicaciones y sin necesidad de incrementar la infraestructura de servidores.
  6. Es quizá la opción más competitiva para diseñar aplicaciones que gestionen grandes cantidades de información generadas por una comunidad elevada de usuarios. Un buen ejemplo sería Facebook, una plataforma en la que se generan cientos de miles de comentarios y contenidos por cada segundo.
  7. No sólo el funcionamiento de las aplicaciones resulta mucho más ágil y potente, sino que además el proceso de desarrollo y programación también resulta mucho más liviano y rápido. Al final estamos hablando de aplicaciones ideales a nivel de experiencia para los usuarios. Uno de los factores determinantes es que NodeJS trabaja mediante el motor V8 de Google. El motor V8 de Google ha sido generado para funcionar dentro de un navegador y poner en marcha el código JavaScript con una velocidad asombrosa. NodeJS está planteado de tal modo que puede efectuar perfectamente el V8 de Google desde el lado del servidor. Esto abre un nuevo abanico de posibilidades y permite que se desarrolle un casi infinito conjunto de librerías que actúan casi como un nuevo ecosistema NodeJS.
  8. Gracias a que NodeJS permite trabajar tanto desde el servidor como desde el cliente, es posible generar una transferencia de información mucho más rápida e inmediata. El resultado de todo esto es una reducción considerable en los periodos de trabajo.
  9. Debido a sus altas prestaciones para gestionar y procesar grandes volúmenes simultáneos de información, NodeJS es una opción estrella para el desarrollo de aplicaciones como chats online o juegos interactivos.
  10. Está diseñado para incentivar el intercambio entre usuarios y programadores: Ha desarrollado una comunidad bastante amplia que permite establecer lazos de colaboración muy interesantes desde diferentes ópticas lo cual resulta muy enriquecedor para los desarrolladores. Además al ser un lenguaje popular y empleado por profesionales de todo el mundo resulta fácil encontrar información y recursos en Internet.

 

¿Qué problema resuelve Node?

La meta número uno declarada de Node es “proporcionar una manera fácil para construir programas de red escalables”.

¿Cuál es el problema con los programas de servidor actuales? Hagamos cuentas. En lenguajes como Java™ y PHP, cada conexión genera un nuevo hilo que potencialmente viene acompañado de 2 MB de memoria. En un sistema que tiene 8 GB de RAM, esto da un número máximo teórico de conexiones concurrentes de cerca de 4.000 usuarios. A medida que crece su base de clientes, si usted desea que su aplicación soporte más usuarios, necesitará agregar más y más servidores. Por todas estas razones, el cuello de botella en toda la arquitectura de aplicación Web (incluyendo el rendimiento del tráfico, la velocidad de procesador y la velocidad de memoria) era el número máximo de conexiones concurrentes que podía manejar un servidor. Node resuelve este problema cambiando la forma en que se realiza una conexión con el servidor. En lugar de generar un nuevo hilo de OS para cada conexión (y de asignarle la memoria acompañante), cada conexión dispara una ejecución de evento dentro del proceso del motor de Node. Node también afirma que nunca se quedará en punto muerto, porque no se permiten bloqueos y porque no se bloquea directamente para llamados E/S.

Node afirma que un servidor que lo ejecute puede soportar decenas de miles de conexiones concurrentes.

Node-JS

Desventajas de node.js

Como la mayoría de las nuevas tecnologías Node no es fácil de implementar en alojamientos existentes.

En alojamientos compartidos habrá que ver si una aplicación de node.js puede funcionar; esto dependerá de la empresa de hosting. Si el alojamiento está en un VPS o servidor dedicado será más sencillo ya que se pueden ejecutar aplicaciones Nodejs sin problemas. Lo más fácil es usar un servicio escalable como Heroku, que es completamente gratuito para desarrollar una web y solo habrá que pagar cuando se necesiten más recursos.

Otras desventajas que se mencionan a menudo: API Inestable (La API de Node tiene la mala costumbre de cambiar en formas que rompen la compatibilidad hacia atrás de versión en versión, lo que requiere que apliques cambios frecuentes en tu código para mantener todo funcionando en las versiones mas actuales); Falta de una Librería Estándar (JavaScript es un lenguajes con un buen núcleo pero con una flaca librería estándar. Cosas que darías por hecho en otro lenguaje del lado del servidor simplemente no existen); Falta de Librerías en General  (¿Necesitas una interfaz de bases de datos madura? ¿Un ORM? ¿Una librería de procesamiento de imágenes? ¿Un analizador XML? Como JavaScript no sido popular en el lado del servidor todo esto es muy reciente, o no está probado o está en camino); y Muchas Formas de Programar (La falta inherente de organización de código se puede considerar una gran desventaja. Se nota su efecto claramente cuando el equipo de desarrollo no está muy familiarizado con la programación asíncrona o los patrones de diseño estándar. Simplemente hay demasiadas formas de programar y de obtener código desparejo y difícil de mantener).

 

Qué no es NodeJS

Node es un programa de servidor. Sin embargo, el producto base de Node definitivamente No es como Apache o Tomcat.

Apache o Tomcat básicamente son productos para servidor listos para instalar y que están listos para implementar aplicaciones instantáneamente. Usted podría tener un servidor estar listo y en operación en un minuto con estos productos. Node definitivamente no es esto. De forma similar a como Apache puede agregar un módulo PHP para permitir a los desarrolladores crear páginas Web dinámicas, y un módulo SSL para conexiones seguras, Node también tiene el concepto de módulos que se pueden agregar a su núcleo mismo. Literalmente hay cientos de módulos de los que se puede escoger con Node, y la comunidad es bastante activa en cuanto a producir, publicar y actualizar docenas de módulos por día.

NodeJS

¿Qué usos reales se le da a nodejs?

Es una herramienta genial para todo tipo de cosas. Aplicaciones web, aplicaciones en línea de comandos, scripts para administración de sistemas, todo tipo de aplicaciones de red, etc.

Es rápido, muy rápido. Y esto es importante por varias razones: El desarrollo es más rápido, la ejecución de tests de unidad se puede hacer más rápido, las aplicaciones son más rápidas y por tanto la experiencia de usuario es mejor y menor coste de infraestructura.

También destaca su flexibilidad. En otros entornos hay un servidor “monolítico” (apache, tomcat, etc.) y tu aplicación se “despliega” en él, y tienes unas estructuras de directorios y ficheros de configuración muy concretos. En nodejs tú lanzas el servidor web, y si quieres puedes lanzar varios, y si quieres puedes lanzar a la vez un servidor ftp, y los lanzas desde el directorio que quieras…

Paypal y NodeJS

Paypal gestiona más de 200 millones de cuentas de usuarios registrados en su plataforma procedentes de todos los países. Impresionante, ¿verdad? Uno de los principales problemas que presentaba su plataforma era la existencia de entornos dispersos dentro de su semántica que realizaban tareas de forma independiente entre las aplicaciones y el servidor. Esta flaqueza fue el detonante para que la plataforma líder en transacciones electrónicas de dinero recurriese a NodeJS. Desde entonces, la plataforma hace uso de JavaScript como único lenguaje en su desarrollo web. Paypal confirmó que después de implementar NodeJS no sólo habían logrado solventar el inconveniente, sino que habían logrado trabajar el doble de rápido en las tareas de desarrollo web y se había reducido un tercio la cantidad de código.

Netflix y NodeJS

Es el servicio de streaming más grande del mundo, sin embargo contaba con diversos problemas en su infraestructura siendo el más grave el de los largos tiempos de carga. Sin embargo, desde que se implementó NodeJS obtuvo una mejora abismal en términos de rendimiento ya que pudo reducir el tiempo de carga de su web en torno a un 70%. Además gracias a NodeJS la plataforma logró perfeccionar notablemente las interfaces de los usuarios y optimizar la compilación de sus directorios.

Linkedin y NodeJS

Es la red profesional más grande del mundo. A día de hoy cuenta con la friolera de más de 450 millones de usuarios registrados. ¿Sabías que su aplicación para móviles está desarrollado íntegramente con NodeJS? El gran potencial de Node y su agilidad fueron las principales causas para que Linkedin recurriese a él. Y es que la eficacia de la implementación se refleja muy bien en sus números:

  • Linkedin ha conseguido una notable reducción de recursos: Pasando de contar con 15 servidores a contar con 4, es decir casi cinco veces menos.
  • Mejora indiscutible en la experiencia de usuario: Gracias a la gran la potencia de su interfaz ha logrado multiplicar por dos su visibilidad y el tráfico que genera.
  • Optimización de la velocidad de carga: Además, ha conseguido multiplicar su velocidad consiguiendo reducirla de dos a diez veces trabajando desde el lado del cliente.

La NASA y NodeJS

NodeJS ha trabajado en una aplicación para la NASA. Después de accidente que tuvo lugar en el espacio, la NASA se percató de que existían ciertas fugas de información y por consiguiente su información se hallaba distribuida por diferentes lugares. Se enfrentaba entonces a un problema de seguridad, por lo que decidió construir su propia arquitectura cifrando todos los datos que conservaba de extremo a extremo. La herramienta utilizada fue NodeJS y el resultado fue un sistema mucho más optimizado que se basa en la existencia de una única base de datos para dar servicio a todas las necesidades de la empresa. Sus mejoras derivaron en una reducción salvaje (300 veces inferior) en los tiempos de espera.

NodeJS Logo

Esta publicación contiene citas de la publicación de IBM “¿Simplemente qué es Node.js? – IBM” publicado el 14 de junio de 2011 por Michael Abernethy y de la página de Wikipedia sobre “Node.js“.

Créditos imágenes: Shutterstock – lassedesignen, Shutterstock – ronstik, Shutterstock – Andrey Smirnov, NodeJS Logo