Introducción rápida a node.js
Continuaciones
Node Package Manager
Despliegue
Escalabilidad
Creado por Ryan Dahl (2009)
Soporte de Joyent y StrongLoop
Hilos: Apache MTM, Java Servlets
Eventos: nginx, node.js
Asíncrono
No bloqueante
Dirigido por eventos
Servidores similares:
Ruby: EventMachine
Java: Akka
Fuente: nodejs.org/about, Wikipedia
Un programador tenía un problema.
Pensó para sí mismo,
"Ya sé, ¡lo resolveré con hilos!".
tiene Ahora problemas. dos él
Adaptado de: Davidlohr Bueso
¿Pero cómo de rápido?
No para correr código secuencial
... pero sí en ejecución concurrente
Sólo un hilo en ejecución (sin hilos)
Multi-proceso usando el módulo cluster
Node.js es muy escalable
Fuente: MediaSmart Mobile
Plataforma inicial: un ingeniero durante un año
Plataforma actual: tres ingenieros durante otro año
Sirve anuncios en móvil para campañas performance
Aguanta 10K peticiones/segundo (al menos)
Escala a 25 servidores (que sepamos)
Latencia < 80 ms
Fuente: MediaSmart Mobile
Página de Resumen de Cuentas
2 ingenieros durante 4 meses
Desarrollado dos veces más rápido que la versión Java
33% menos código, 40% menos ficheros
Aguanta dos veces más peticiones por segundo
Tiempos de respuesta un 35% más rápidos
Fuente: Node.js at PayPal
Backend de apps móviles (2011)
Migración desde Ruby on Rails
De 15 instancias a 4 con node.js
El doble de carga que Ruby on Rails
Actualmente migrando toda su infraestructura
'use strict';
var net = require('net');
var server = net.createServer(function(connection) {
console.log('Connection open');
connection.write('Hello?\n');
connection.on('data', function(data) {
if (String(data).trim() != 'hello') {
connection.write('ERROR\n');
} else {
connection.end('world\n');
console.log('Connection closed');
}
});
});
var port = 8080;
server.listen(port);
console.log('Server listening on port %s', port);
Introducción al infierno de las callbacks
Concepto de programación funcional
CPS: Continuation-passing Style
El estado pasa como parámetros y clausuras
Ideal para llamadas asíncronas
La temida pirámide de callbacks
Infinitas continuaciones anidadas
Abuso de lambdas (funciones anónimas)
Difícil de seguir, depurar y refactorizar
Usar funciones con nombre
Crear un objeto con funciones con nombre
Las clausuras se convierten en atributos
Usar async: async.waterfall()
Usar eventos: EventEmitter
Corutinas: falta bastante todavía
Revisar la pirámide de callbacks
Código original: simplecached client
Explorar varios métodos diferentes
No dejar más de dos callbacks anidadas
Fichero Readme: README.md
Definición: package.json
Punto de entrada: index.js
Código: lib/
Documentación: doc/
Binarios: bin/
npm install
: instala uno o más paquetesnpm install
-g: instalación globalnpm update
: actualiza uno o más paquetesnpm remove
: elimina un paquetenpm test
: corre las pruebasFuente: npm-index
Local:
node_modules
../node_modules
../../node_modules
...
$HOME/node_modules
./node_modules
Global:
{prefix}/lib/node_modules
donde {prefix} suele ser /usr/local
Fuente: npm-folders
{
"name": "simplecached",
"version": "0.0.1",
"description": "Simplified memcached server.",
"contributors": ["Alex Fernández <alexfernandeznpm@gmail.com>"],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/alexfernandez/simplecached"
},
"dependencies": {
"testing": "1.2.x"
},
"keywords" : ["simplecached", "didactic", "memcached", "caching"],
"bin": {
"simplecached": "bin/server.js"
},
"scripts": {
"test": "node test.js"
},
}
Fuente: package.json
Paquete educactivo simplecached
Instalación:
npm install simplecached
Revisar package.json
Correr las pruebas
npm test
Tres reglas básicas:
Sistema distribuido: git
git en hosting: GitHub
Integrador ejecutivo
Pull Requests
Revisar cada Pull Request:
Revisar el código antes de desplegar
¡automáticamente!
Usar JSLint (versión talibán)
JSHint (muy configurable)
Suite de pruebas unitarias
Suite de pruebas de integración
Automatización de pruebas
Integrar cada cambio
Desplegar en entorno de pruebas
Realizar pruebas exhaustivas
¡automáticas!
(Ejemplo)
Apache ab
Detección de regresiones:
Realizar pruebas de carga en cada integración
¡Pruebas automáticas!
API de control
Desplegar cada cambio
Entre 5 y cientos de despliegues al día
No permite que se acumulen los cambios
Usar el módulo cluster
Master + n workers
Comparten conexiones
Reiniciar worker cada pocos minutos:
Servidores sin estado
Operaciones idempotentes
Múltiples frontales balanceados
Base de datos compartida
Trabajo diferido
Ideal para procesamiento asíncrono
Permite quitar carga del camino online
y agregarlo
RabbitMQ, Redis pub/sub
https://slid.es/alexfernandez/node-js-produccion