Node.js semble intéressant, MAIS je dois manquer quelque chose - Node.js n'est-il pas réglé uniquement pour fonctionner sur un seul processus et thread?
Alors, comment évolue-t-il pour les processeurs multicœurs et les serveurs multi-processeurs? Après tout, c'est génial de faire le plus rapidement possible un serveur monofil, mais pour des charges élevées, je voudrais utiliser plusieurs processeurs. Et il en va de même pour rendre les applications plus rapides - il semble aujourd'hui que la méthode consiste à utiliser plusieurs processeurs et à paralléliser les tâches.
Comment Node.js s'intègre-t-il dans cette image? Est-ce son idée de distribuer en quelque sorte plusieurs instances ou quoi?
javascript
node.js
node-cluster
zaharpopov
la source
la source
Réponses:
[ Ce message est à jour en date du 2012-09-02 (plus récent que ci-dessus). ]
Node.js évolue absolument sur les machines multicœurs.
Oui, Node.js est un thread par processus. Il s'agit d'une décision de conception très délibérée et élimine la nécessité de gérer la sémantique de verrouillage. Si vous n'êtes pas d'accord avec cela, vous ne réalisez probablement pas encore à quel point il est incroyablement difficile de déboguer du code multithread. Pour une explication plus approfondie du modèle de processus Node.js et pourquoi il fonctionne de cette façon (et pourquoi il ne prendra JAMAIS en charge plusieurs threads), lisez mon autre article .
Alors, comment puis-je profiter de ma boîte à 16 cœurs?
Deux façons:
Mise à l'échelle du débit sur un service Web
Depuis v6.0.X Node.js a inclus le module de cluster directement, ce qui facilite la configuration de plusieurs nœuds de travail pouvant écouter sur un seul port. Notez que ce n'est PAS le même que l'ancien module "cluster" learnboost disponible via npm .
Les travailleurs seront en concurrence pour accepter de nouvelles connexions, et le processus le moins chargé est le plus susceptible de gagner. Cela fonctionne assez bien et peut augmenter le débit assez bien sur une boîte multicœur.
Si vous avez suffisamment de charge pour vous soucier de plusieurs cœurs, vous voudrez également faire quelques choses:
Exécutez votre service Node.js derrière un proxy Web comme Nginx ou Apache - quelque chose qui peut limiter la connexion (sauf si vous voulez que les conditions de surcharge réduisent complètement la boîte), réécrire les URL, servir du contenu statique et proxy d'autres sous-services.
Recyclez régulièrement vos processus de travail. Pour un processus de longue durée, même une petite fuite de mémoire finira par s'additionner.
Configuration de la collecte / surveillance des journaux
PS: Il y a une discussion entre Aaron et Christopher dans les commentaires d'un autre article (à ce jour, c'est le premier article). Quelques commentaires à ce sujet:
Ports partagés:
nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
contre
Ports individuels:
nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
Il y a sans doute certains avantages à la configuration des ports individuels (potentiel d'avoir moins de couplage entre les processus, d'avoir des décisions d'équilibrage de charge plus sophistiquées, etc.), mais c'est certainement plus de travail à configurer et le module de cluster intégré est un faible -alternative de complexité qui fonctionne pour la plupart des gens.
la source
Une méthode consisterait à exécuter plusieurs instances de node.js sur le serveur, puis à placer un équilibreur de charge (de préférence un non bloquant comme nginx) devant eux.
la source
Ryan Dahl répond à cette question dans le discours technique qu'il a donné à Google l'été dernier. Pour paraphraser, "exécutez simplement plusieurs processus de nœuds et utilisez quelque chose de sensé pour leur permettre de communiquer. Par exemple IPC de style sendmsg () ou RPC traditionnel".
Si vous voulez vous salir les mains immédiatement, consultez le modulespark2Forever . Il facilite la génération de plusieurs processus de nœuds. Il gère la configuration du partage de port, afin qu'ils puissent chacun accepter des connexions au même port, ainsi que la réapparition automatique si vous voulez vous assurer qu'un processus est redémarré si / quand il meurt.MISE À JOUR - 11/11/11 : Le consensus dans la communauté des nœuds semble être que le cluster est maintenant le module préféré pour gérer plusieurs instances de nœuds par machine. Forever vaut également le détour.
la source
Vous pouvez utiliser le module de cluster . Vérifiez ça .
la source
Plusieurs nœuds exploitent tous les cœurs que vous pouvez avoir.
Jetez un œil à http://github.com/kriszyp/multi-node .
Pour des besoins plus simples, vous pouvez démarrer plusieurs copies de nœud sur différents numéros de port et placer un équilibreur de charge devant eux.
la source
Node Js prend en charge le clustering pour tirer pleinement parti de votre processeur. Si vous ne l'exécutez pas avec le cluster, vous perdez probablement vos capacités matérielles.
Le clustering dans Node.js vous permet de créer des processus distincts qui peuvent partager le même port de serveur. Par exemple, si nous exécutons un serveur HTTP sur le port 3000, il s'agit d'un serveur fonctionnant sur un seul thread sur un seul cœur de processeur.
Le code ci-dessous vous permet de regrouper votre application. Ce code est le code officiel représenté par Node.js.
consultez cet article pour le tutoriel complet
la source
Comme mentionné ci-dessus, Cluster dimensionnera et équilibrera la charge de votre application sur tous les cœurs.
ajouter quelque chose comme
Redémarrera tous les travailleurs défaillants.
De nos jours, beaucoup de gens préfèrent également PM2 , qui gère le clustering pour vous et fournit également des fonctionnalités de surveillance intéressantes .
Ensuite, ajoutez Nginx ou HAProxy devant plusieurs machines fonctionnant avec le clustering et vous avez plusieurs niveaux de basculement et une capacité de charge beaucoup plus élevée.
la source
La future version du nœud vous permettra de bifurquer un processus et de lui passer des messages et Ryan a déclaré qu'il voulait trouver un moyen de partager également les gestionnaires de fichiers, donc ce ne sera pas une implémentation Web Worker simple.
Pour le moment, il n'y a pas de solution facile pour cela, mais c'est encore très tôt et le nœud est l'un des projets open source les plus rapides que j'ai jamais vus, alors attendez-vous à quelque chose de génial dans un avenir proche.
la source
Spark2 est basé sur Spark qui n'est désormais plus maintenu. Cluster est son successeur, et il a des fonctionnalités intéressantes, comme la génération d'un processus de travail par cœur de processeur et la réapparition de travailleurs morts.
la source
J'utilise Node Worker pour exécuter des processus de manière simple à partir de mon processus principal. Semble fonctionner très bien pendant que nous attendons la manière officielle de contourner.
la source
Le nouveau sur le bloc ici est "Up" de LearnBoost .
Il fournit des «rechargements sans temps d'arrêt» et crée en outre plusieurs travailleurs (par défaut, le nombre de CPU, mais il est configurable) pour fournir le meilleur de tous les mondes.
Il est nouveau, mais semble assez stable, et je l'utilise avec bonheur dans l'un de mes projets en cours.
la source
Le module de cluster vous permet d'utiliser tous les cœurs de votre machine. En fait, vous pouvez en profiter en seulement 2 commandes et sans toucher à votre code en utilisant un gestionnaire de processus très populaire pm2 .
la source
Vous pouvez exécuter votre application node.js sur plusieurs cœurs en utilisant le module de cluster en combinaison avec le module os qui peut être utilisé pour détecter le nombre de CPU dont vous disposez.
Par exemple, imaginons que vous avez un
server
module qui exécute un serveur http simple sur le backend et que vous souhaitez l'exécuter pour plusieurs processeurs:la source
Il est également possible de concevoir le service Web comme plusieurs serveurs autonomes qui écoutent les sockets Unix, de sorte que vous pouvez pousser des fonctions telles que le traitement des données dans des processus séparés.
Ceci est similaire à la plupart des architectures de serveur Web scrpting / base de données où un processus cgi gère la logique métier, puis pousse et extrait les données via un socket Unix vers une base de données.
la différence étant que le traitement des données est écrit comme un serveur web de noeud écoutant sur un port.
c'est plus complexe, mais en fin de compte, c'est là où le développement multicœur doit aller. une architecture multiprocessus utilisant plusieurs composants pour chaque requête Web.
la source
Il est possible de faire évoluer NodeJS sur plusieurs boîtiers à l'aide d'un équilibreur de charge TCP pur (HAProxy) devant plusieurs boîtiers exécutant chacun un processus NodeJS.
Si vous avez alors des connaissances communes à partager entre toutes les instances, vous pouvez utiliser un magasin Redis central ou similaire auquel vous pouvez ensuite accéder à partir de toutes les instances de processus (par exemple à partir de toutes les boîtes)
la source