Multiproceso


en Node.js

Alejandro Fernández


Desarrollador Senior en MediaSmart Mobile

Consultor de Escalabilidad

@pinchito

Vamos a ver hoy


Estrategias: Up & Out


Multiproceso 


Módulo cluster


Demo 

Estrategias


Minard: Carte Figurative (1869)

Escalado vertical y horizontal


General Sherman     vs                    pinar sueco

Escalado moderno

Múltiples cores

MultiProceso


Controla la máquina

Multicore is eating the world



Fuente: EE Times

Así que, ¿qué piensas hacer con todos esos cores?

El mundo es multicore


Quad core AMD Opteron

Estrategias Multiproceso


Java, Erlang, Objective-C: Multi-threading


C, C++, Go: Explicit multi-process


Python, Ruby: global lock


Node.js: single core

Map Reduce


Divide y vencerás


Divide las tareas entre procesos


Agrega los resultados finales


Reinicia los procesos que no terminen

Node.js Cluster

Repartiendo la carga

Módulo Cluster


API "experimental" para controlar el multiproceso


Un master, varios workers


Los sockets se comparten


Fuente: GodTIC

Modelo Unix: fork()


var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
} else {
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(8000);
} 
Fuente: cluster

Mensajes


Envío: 

process.send(message); 

Recepción:

Object.keys(cluster.workers).forEach(function(id) {
    cluster.workers[id].on('message', messageHandler);
});

De los workers a master

También disponible al revés


Fuente: child_process

Demo


Engelbart: The Mother of All Demos, 1969

Especificación técnica


Calcular los hashes SHA-256 hasta el número dado


Contar el número de letras A en el hexadecimal


Sumar el total de letras en todos los hashes


Comparar con el valor teórico

Solución


Repo count-hashes

$ time node count-as.js 1000000 


Dividir con cluster

$ time node multicount-as.js 1000000 

¡Tachán!

¡Gracias!

@pinchito