Introducción práctica a

para



Día 6: Streams, rendimiento

Vuestro anfitrión

Alex Fernández

Ingeniero senior en LogTrust

Co-organizador de Node.js Madrid

@pinchito

Índice día 6


  • Introducción a los streams

  • Sesión práctica 1: proxy

  • Rendimiento

  • Sesión práctica 2: pruebas de carga

Introducción a Streams

  File:3 Rivers Joining at Talkeetna, Alaska.jpg

Streams


La abstracción oficial de Node.js


Orientados a eventos


Lectura y escritura


Duplex y transform

Writable API


Escritura

writable.write(chunk[, callback])


Fin

writable.end(callback) 


Acumular

writable.cork()
writable.uncork() 

Readable: Dos modos


Flowing


Non-flowing


Pausar y reanudar


Empipar

Readable API (Flowing)


Event: 'data'

stream.on('data', data => ...) 


Pausar

stream.pause() 


Reanudar

stream.resume()  

Readable API (non-Flowing)


Event: 'readable'

stream.on('readable', () => ...) 

Lectura

const data = stream.read() 

Si data es null, no hay más

Back-Pressure


Permite regular el flujo de datos


Evita la acumulación en buffers


Implementada con:

readable.on('data', data => {
  if (!writable.write(data)) readable.pause()
})
writable.on('drain', () => readable.resume())

Documentación oficial

File:Biblioteca del castell de peralada-2013 (5).JPG ...
https://nodejs.org/api/stream.html

Sesión Práctica 1: proxy


Crear un proxy que redirija los datos a otro puerto


Recibir conexión y abrir conexión


Medir rendimiento

Especificación Técnica


Escuchar por puerto 9408

Redirigir al puerto 4301


Crear un servidor HTTP en el puerto 4301

Que responda a todas las peticiones con la ruta


Crear un cliente que envíe peticiones HTTP


Medir MB enviados, recibidos y redirigidos

Success!

Daft Punk Drums GIF - Find & Share on GIPHY

Bonus Track


Implementar back-pressure


Crear un número de clientes, de 0 a 100


Comprobar cómo cambia el rendimiento


Variar los datos enviados/recibidos por petición

Rendimiento


Presentación de T3chFest

Sesión Práctica 2: Pruebas de carga


Lanzar pruebas de carga contra el proxy


Lanzar pruebas de carga contra el servidor http


Lanzar pruebas contra el servidor con carga

Especificación técnica


Pruebas contra puertos 9408 y 4301


Acceder a ambos con loadtest

npm install -g loadtest


Ajustar peticiones por segundo (--rps)

loadtest --rps 1000 http://localhost:9408/ 

Good Job!



Bonus Track


Perfilar el servidor con microprofiler

npm install microprofiler 


Perfilar el servidor con

node --prof 


Revisar con

node --prof-process isolate-....log 

Fin del día 6