En lo personal se me ha hecho difícil entender la programación orientada a eventos en especial los conceptos de I/O bloqueado y no bloqueado, ahora que los entiendo se que es lo que hace a Node.js diferente y por que la gente habla tanto de el, lo explicaré con dos analogías que se usan en la vida real.
Modelo tradicional – Los bancos
En este modelo tradicional (Modelo basado en hilos o “threads”) esperamos en la fila a esperar a un cajero disponible, cuando es tu turno, este te atiende todo el tiempo hasta que completes lo que deseas hacer (tu transacción). Si tu tienes que hacer 3 depósitos o llenar los formularios de apertura de una nueva tarjeta o del deposito se bloquea a este cajero hasta que termines, es decir, lo estas bloqueando y no puede atender a otra persona ya que te está esperando.
El problema de este modelo es que para atender a más personas debes agregar a mas cajeros, esto tiene implicaciones financieras y físicas ya que debes contratar a mas gente y darles un lugar y muchas otras cosas más.
Modelo a eventos – La recepcionista de un doctor
En este modelo (Modelo basado en eventos) , cuando te toca el turno la recepcionista te atiende y si ella te dice que debes llenar los formularios del seguro, o de tu hospitalización te da una pluma, los formularios y te indica que cuando termines de llenarlos pases con ella para seguir con el proceso. Te sientas o llenas los formularios mientras ella atiende a la siguiente persona, es decir, no estás bloqueando completamente sus servicios.
Cuando terminas de llenar estos documentos, regresas a la fila y esperas para hablar con la recepcionista nuevamente, si te equivocas debes llenar los formularios nuevamente y esperar en la fila.
La ventaja de este modelo como se puede observar es que la fila empieza a fluir mas rápidamente dejando salir las operaciones menos costosas y atendiendo la fila mientras que los trabajos pesados se hacen en otro apartado haciendo un sistema altamente escalable, claro, habrá un punto en que la fila crezca lo suficiente que habrá que poner otra recepcionista pero no a tal nivel como se requiere en el sistema de hilos o tradicional.
¿Esto que tiene que ver con Node.js?
El modelo tradicional es el usado por la mayoría de los servidores web actuales, si inicias Apache este se pone en modo espera de peticiones, al llegar una mantiene la conexión abierta hasta que la transacción termine. Si se hace una consulta en el disco duro, o a una base de datos, esta conexión bloquea el I/O y hace que las conexiones se mantengan o esperen hasta que esté disponible el medio, esto se conoce como I/O bloqueado. Por lo general esta operación se realiza en milisegundos, para escalar con este tipo de servidores es necesario lanzar copias del servidor para que este pueda atender mas peticiones.
Con Node.js y su modelo basado en eventos, el servidor acepta la petición y la manda a la fila, va y atiende la siguiente petición y las manda a la fila, cuando la primer petición o las subsecuentes terminan la respuesta se envía a la fila y al llegar su turno devuelve la respuesta.
La diferencia claro está en que en el modelo basado en eventos siempre se mantiene ocupado sin esperar a las otras conexiones terminen las operaciones que bloquean ciertos recursos.
Para ponerlo muy en especifico:
- Tu usas tu servidor web para hacer una peticion a “/minegocio.html” en Node.JS
- Node.JS acepta tu petición y lanza la función que dice “trae ese archivo del disco duro”.
- Mientras el servidor espera a que se traiga ese archivo, este atiende la siguiente petición web.
- Cuando el archivo es traido, hay una función de retroalimentación (callback function) que se ingresa en la fila de peticiones.
- Cuando el servidor ejecuta esa función entrega la parte leida de “minegocio.html” al navegador.
Ahora, como bien sabemos este proceso de leer el archivo tarda microsegundos pero en un ambiente muy congestionado, ¡Cada microsegundo cuenta!
Y esta es la característica que hace a Node.js diferente en estos momentos y que ha ayudado a crear aplicaciones muy escalables de manera fácil.