Este documento resume algunas maneras en que se puede cometer errores al usar Node.js, incluyendo problemas pequeños, callback hell, y el event loop. Se discuten soluciones como usar promesas para evitar callback hell, cluster y child_process para evitar bloqueos del CPU, y herramientas de depuración como debug. El objetivo es ayudar a los desarrolladores a evitar problemas comunes al usar Node.js.
8. Depurar con console.log
debug
Salida por consola activable
vía variable de entorno
Posibilidad de nombrar
cada fichero a trazar
winston o bunyan
Serializan objetos
Salida a donde quieras
Formato JSON
Bunyan tiene bunyan-cli
para procesar logs
13. ¿Brujeria?
● ¿Qué esperan de mí los módulos de promesas?
o callbacks(err, res), el error siempre primero
o return del resultado
o throw del error
● ¿Y ya está?
o Si, lo básico si.
14. ¿Y… cómo las uso?
1. Adaptar el
módulo que
quieras usar
2. Usarlo:
algo.then….
3. .catch, por si las
moscas
16. Javascript… sweet painful Javascript
● En Javascript, y especialmente en Node:
o Todo funciona en paralelo…
o Excepto tu código
● O dicho de otra forma:
o Un único hilo para el código JS ( V8 )
o Un manejador de eventos que distribuye el I/O
o libuv por debajo manejando I/O en paralelo
18. Problems
● setTimeout, setImmediate, setInterval
o únicamente tienes asegurado que se van a atender
después del tiempo especificado
● Hay callbacks, y luego señores callbacks
● Una operación intensiva de CPU bloquea el event loop
o Se encolan eventos pero no se atienden callbacks
20. Callbacks asíncronos de verdad
La primera función
no deja que otro
código js se ejecute.
La segunda si,
encola el callback
hasta que pueda ser
atendido
21. Dear CPU...
● Como hemos visto cualquier tipo de código
o Extenso
o Complejo
o Pesado
Que no cede el turno de ejecución puede
bloquear completamente otros eventos o
partes de nuestro código
23. Cluster
● Módulo core de node
● Permite levantar procesos clones ( fork )
o Un maestro, cuantos quieras esclavos
o El maestro recibe eventos de los otros
o Se pueden enviar mensajes entre ellos
o Comparten puertos pero no memoria
o No evita que las peticiones de uno queden en
espera si este se bloquea, pero el resto siguen
atendiendo
24. child_process
● Módulo core de node
● Permite levantar procesos cualquiera ( exec )
o El padre recibe ciertos eventos del hijo
o Se pueden enviar mensajes entre ellos
o No comparten nada
o Solventa el bloqueo de tu event loop si le envias al
child la computación pesada y esperas su respuesta
o Puede dar lugar a un número descontrolado de
childs o un child sobrecargado.
25. worker-farm
● Módulo de npm
● child_process automatizado, con esteroides
o Concepto thread pool
o Configurable: reintentos, tiempo de espera, número
de workers…
o Pierdes el paso de mensajes, pero no tienes que
implementar tu todo lo anterior
26. Espero que haya menos plomo en
vuestros pies ahora.
Gracias
Preguntas:
alferpal@gmail.com @alferpal