Maison  >  Article  >  interface Web  >  Utilisez le cluster pour étendre votre serveur Node en un server_node.js multithread

Utilisez le cluster pour étendre votre serveur Node en un server_node.js multithread

WBOY
WBOYoriginal
2016-05-16 16:31:481335parcourir

Les amis qui utilisent nodejs savent tous que node est monothread, ce qui signifie qu'il fonctionne sur un processeur à 8 cœurs et ne peut utiliser que la puissance de calcul d'un seul cœur.
Le monothreading a toujours été une critique du nœud, mais avec l'introduction du cluster dans la version 0.6, cette situation a changé. Les développeurs peuvent compter sur le cluster pour étendre facilement leur serveur Node en un serveur multithread.

Qu'est-ce que le cluster

Le cluster est une bibliothèque multithread fournie par le nœud. Les utilisateurs peuvent l'utiliser pour créer plusieurs threads. Lorsqu'il y a une demande externe pour ce port, le cluster transmettra la demande à un thread aléatoire. . Étant donné que chaque thread de nœud occupera des dizaines de mégaoctets de mémoire, vous ne pouvez pas créer un thread pour chaque requête comme le fait PHP. De manière générale, le nombre de threads créés ne dépassera pas le nombre de cœurs du processeur.

Copier le code Le code est le suivant :

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

if (cluster.isMaster) {
// Travailleurs à la fourchette.
pour (var i = 0; i < numCPUs; i ) {
​ cluster.fork();
>

cluster.on('exit', function(worker, code, signal) {
console.log('worker ' worker.process.pid ' est mort');
});
} autre {
// Les travailleurs peuvent partager n'importe quelle connexion TCP
// Dans ce cas c'est un serveur HTTP
http.createServer(function(req, res) {
res.writeHead(200);
res.end("bonjour tout le monde");
}).écouter(8000);
>

Comme indiqué dans le code ci-dessus, cluster.isMaster sera défini sur true lorsque le programme est en cours d'exécution. Après avoir appelé cluster.fork(), le programme créera un thread et l'exécutera à nouveau, cluster.isMaster. sera défini sur false . Nous utilisons principalement cette variable pour déterminer si le thread actuel est un thread enfant.

Vous pouvez également remarquer qu'après la création de chaque thread enfant, il écoutera le port 8000 sans provoquer de conflits. C'est la fonction des ports partagés du cluster.

Communication entre les fils de discussion

Lorsque les threads sont créés, ils ne partagent ni mémoire ni données entre eux. Tous les échanges de données ne peuvent être traités que dans le thread principal via Worker.send et Worker.on('message', handler). Voici un exemple de système de diffusion.

Copier le code Le code est le suivant :

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

if (cluster.isMaster) {

var travailleurs=[];
//Créer un nouveau travailleur
fonction newWorker(){
var travailleur=cluster.fork();

//Écoutez l'information, si le type est diffusé, il est déterminé qu'il est diffusé
travailleur.on('message', function(msg) {
Si(msg.type=='broadcast'){
        var event=msg.event;
//Envoyer cette diffusion à tous les travailleurs
travailleurs.forEach(fonction(travailleur){
travailleur.send(événement);
})
>
});
Travailleur de retour ;
>

pour (var i = 0; i < numCPUs; i ) {
Workers.push(newWorker());
>

cluster.on('online',function(worker){
console.log('worker %d est en ligne',worker.id);
})
} autre {
var travailleur=cluster.worker;

//La diffusion consiste à envoyer un message de type diffusion, et l'événement est le contenu diffusé
travailleur.broadcast=fonction (événement){
travailleur.envoyer({
Tapez : 'diffusion',
       événement :événement
});
>

//Il semble que les informations renvoyées ne puissent pas être surveillées à l'aide de worker.on ici
process.on('message',function(event){
console.log('worker: 'worker.id' événement reçu de ' event.workerId);
})

//Envoyer la diffusion
travailleur.broadcast({
Message : 'en ligne',
identifiant_travailleur :travailleur.id
})
>

Problèmes qui nécessitent une attention

Comme mentionné ci-dessus, les données ne peuvent pas être partagées entre les threads, et tout échange de données ne peut être échangé que via la communication entre les threads. Et les données échangées sont toutes sérialisables, donc des éléments tels que les fonctions, les descripteurs de fichiers et HttpResponse ne peuvent pas être transmis.

Si vous utilisez un cluster, vous devez prendre en compte la question de l'échange de données lors de la conception du programme. Ma propre approche consiste à stocker des données comme des sessions dans Redis, et chaque thread fait un bon travail pour y accéder. dans la mémoire du nœud.

Dernier point, le cluster est actuellement officiellement marqué comme Expérimental par Node, et l'API pourrait changer dans le futur.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn