La création d'une application node.js est assez simple.
var app = require('express')();
app.get('/',function(req,res){
res.send("Hello world!");
});
Mais supposons que les gens deviennent obsédés par votre Hello World!
application et épuisé vos ressources. Comment cet exemple pourrait-il être étendu à la pratique? Je ne le comprends pas, car oui, vous pouvez ouvrir plusieurs instances de node.js sur différents ordinateurs - mais quand quelqu'un accède http://your_site.com/ il vise directement cette machine spécifique, cette machine spécifique port, ce processus de nœud spécifique. Alors comment?
Il existe de nombreuses façons de gérer cela, mais cela se résume à 2 choses:
Pour la première option, vous pouvez utiliser node-cluster
ou la même solution que pour l'option seconde. node-cluster
( http://nodejs.org/api/cluster.html ) est essentiellement un moyen intégré de bifurquer le processus de nœud en un maître et plusieurs travailleurs. En règle générale, vous voudriez 1 maître et n-1 à n travailleurs (n étant le nombre de cœurs disponibles).
La deuxième option consiste à utiliser un équilibreur de charge qui répartit les demandes entre plusieurs travailleurs (sur le même serveur ou sur plusieurs serveurs).
Ici, vous avez également plusieurs options. Voici quelques-uns:
upstream
serveur)Une dernière chose, une fois que vous commencez à avoir plusieurs processus servant les demandes, vous ne pouvez plus utiliser la mémoire pour stocker l'état, vous avez besoin d'un service supplémentaire pour stocker les états partagés, Redis ( http://redis.io ) est un choix populaire, mais en aucun cas le seul.
Si vous utilisez des services tels que cloudfoundry, heroku et autres, ils le configurent pour vous, vous n'avez donc qu'à vous soucier de la logique de votre application (et utiliser un service pour gérer l'état partagé)
Je travaille avec node depuis un certain temps, mais j'ai récemment eu l'occasion d'essayer de mettre à l'échelle mes applications de noeud et je fais des recherches sur le même sujet depuis un certain temps maintenant et j'ai rencontré les conditions préalables suivantes pour la mise à l'échelle:
Mon application doit être disponible sur un système distribué exécutant chacun plusieurs instances de nœud
Chaque système doit avoir un équilibreur de charge qui aide à répartir le trafic entre les instances de nœud.
Il doit y avoir un équilibreur de charge principal qui doit répartir le trafic entre les instances de noeud sur les systèmes distribués.
L'équilibreur principal doit toujours être en cours d'exécution OR doit avoir un mécanisme de redémarrage fiable pour maintenir l'application stable.
Pour les conditions ci-dessus, je suis tombé sur les éléments suivants:
Utilisez des modules comme cluster pour démarrer plusieurs instances de noeud dans un système.
Utilisez toujours nginx. C'est l'un des mécanismes les plus simples pour créer un équilibreur de charge que j'ai rencontré jusqu'à présent
Utilisez HAProxy pour agir comme un équilibreur de charge principal. A quelques pointeurs sur la façon de l'utiliser et de le faire fonctionner indéfiniment.
Ressources utiles:
Je continuerai de mettre à jour cette réponse au fur et à mesure de ma progression.
La manière de base d'utiliser plusieurs machines consiste à les placer derrière un équilibreur de charge et à pointer tout votre trafic vers l'équilibreur de charge. De cette façon, quelqu'un va http://my_domain.com , et il pointera vers la machine d'équilibrage de charge. Le seul objectif (pour cet exemple de toute façon; en théorie, davantage pourrait être fait) de l'équilibreur de charge est de déléguer le trafic à une machine donnée exécutant votre application. Cela signifie que vous pouvez avoir x nombre de machines exécutant votre application, mais une machine externe (dans ce cas, un navigateur) peut aller à l'adresse de l'équilibreur de charge et accéder à l'une d'entre elles. Le client ne sait pas (et n'a pas besoin de savoir) quelle machine traite réellement sa demande. Si vous utilisez AWS , il est assez facile à configurer et à gérer. Notez que la réponse de Pascal contient plus de détails sur vos options ici.
Avec Node spécifiquement, vous voudrez peut-être regarder le module Node Cluster . Je n'ai pas vraiment beaucoup d'expérience avec ce module, cependant il devrait vous permettre de engendrer plusieurs processus de votre application sur une machine partageant tous le même port. Nœud également qu'il est encore expérimental et je ne sais pas à quel point ce sera fiable.
Je recommanderais de jeter un œil à http://senecajs.org , une boîte à outils de microservices pour Node.js. C'est un bon point de départ pour les débutants et pour commencer à penser aux "services" au lieu des applications monolithiques.
Cela dit, la construction d'applications distribuées est difficile, prenez le temps d'apprendre, prenez [~ # ~] beaucoup [~ # ~] de temps pour le maîtriser , et vous devrez généralement faire face à de nombreux compromis entre performances, fiabilité, cantonnement, etc.