Los amigos que usan NodeJs saben que el nodo es de un solo hilo, lo que significa que al ejecutar una CPU de 8 núcleos, solo puede usar la potencia informática de un núcleo.
El enhebrado único siempre ha sido una crítica a los nodos, pero con la introducción de Cluster en la versión 0.6, esta situación ha cambiado. Los desarrolladores pueden confiar en el clúster para expandir fácilmente su servidor de nodo a un servidor de múltiples subprocesos.
Que es el clúster
El clúster es una biblioteca múltiple proporcionada por Node. Los usuarios pueden usarlo para crear múltiples hilos. Los hilos comparten un puerto de escucha. Cuando hay una solicitud externa a este puerto, Cluster reenviará la solicitud a un hilo aleatorio. Debido a que cada hilo de nodo ocupará decenas de megabytes de memoria, es imposible crear un hilo para cada solicitud como PHP. En términos generales, el número de hilos creados no excederá el número de núcleos de CPU como máximo.
La copia del código es la siguiente:
var cluster = request ('cluster');
var http = require ('http');
var numCpus = request ('OS'). CPUS (). Longitud;
if (cluster.ismaster) {
// trabajadores de bifurcación.
para (var i = 0; i <numCpus; i ++) {
cluster.fork ();
}
cluster.on ('exit', function (trabajador, código, señal) {
console.log ('trabajador' + trabajador.process.pid + 'die');
});
} demás {
// Los trabajadores pueden compartir cualquier conexión TCP
// En este caso es un servidor HTTP
http.createServer (function (req, res) {
Res.Writehead (200);
res.end ("Hello World/n");
}). Escuchar (8000);
}
Como se muestra en el código anterior, Cluster.ismaster se establecerá en True cuando el programa se esté ejecutando. Después de llamar a cluster.fork (), el programa creará un hilo y volverá a ejecutarlo. En este momento, Cluster.ismaster se establecerá en falso. Usamos principalmente esta variable para determinar si el hilo actual pertenece a un hilo infantil.
También se puede observar que después de que se cree cada hilo infantil, escuchará el puerto 8000 sin causar conflictos. Esta es la función de los puertos compartidos de clúster.
Comunicación entre hilos
Cuando se crean hilos, no comparten memoria o datos entre sí. Todo el intercambio de datos solo se puede procesar en el hilo principal a través de Worker.send y Worker.on ('Mensaje', Handler). El siguiente enumera un ejemplo de un sistema de transmisión.
La copia del código es la siguiente:
var cluster = request ('cluster');
var http = require ('http');
var numCpus = request ('OS'). CPUS (). Longitud;
if (cluster.ismaster) {
trabajadores var = [];
// crear un nuevo trabajador
función NewWorker () {
var trabajador = cluster.fork ();
// Escuchar información. Si el tipo se transmite, se determinará como una transmisión
Worker.on ('Mensaje', function (MSG) {
if (msg.type == 'Broadcast') {
VAR Event = msg.event;
// Envía esta transmisión a todos los trabajadores
trabajadores.ForEach (función (trabajador) {
trabajador.send (evento);
})
}
});
trabajador de regreso;
}
para (var i = 0; i <numCpus; i ++) {
trabajadores.push (newWorker ());
}
cluster.on ('en línea', function (trabajador) {
console.log ('Works %D está en línea', Worker.id);
})
} demás {
var trabajador = cluster.worker;
// La transmisión es enviar un mensaje con el tipo de transmisión, el evento es contenido de transmisión
trabajador.broadcast = function (evento) {
trabajador.send ({
Tipo: 'Broadcast',
Evento: evento
});
}
// Esto no es posible escuchar la información devuelta usando Worker.on aquí.
Process.on ('Mensaje', function (evento) {
console.log ('Worker:'+Worker.id+'Evento recuperado de'+Event.WorkerId);
})
// Enviar transmisión
Worker.Broadcast ({
Mensaje: 'en línea',
WorkerID: Worker.id
})
}
Problemas a tener en cuenta
También se menciona anteriormente que los datos no se pueden compartir entre hilos, y todos los intercambios de datos solo se pueden intercambiar a través de la comunicación entre hilos. Además, los datos intercambiados son serializables, por lo que no se pueden aprobar funciones, descriptores de archivos y httpresponse.
Si usa Cluster, debe considerar el problema de intercambio de datos al diseñar el programa. Mi propio enfoque es almacenar todos los datos similares a la sesión en Redis, y cada hilo hace el trabajo de almacenamiento y retirada, y todos los datos no se colocan en la memoria de nodos.
Last Point, el clúster actualmente está oficialmente marcado como experimental por nodo, y la API puede cambiar en el futuro.