web-dev-qa-db-fra.com

Comment créer une application node.js distribuée?

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?

41
MaiaVictor

Il existe de nombreuses façons de gérer cela, mais cela se résume à 2 choses:

  1. pouvoir utiliser plus de cœurs par serveur
  2. pouvoir évoluer au-delà de plusieurs serveurs.

cluster de nœuds

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).

équilibreurs de charge

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:

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é)

35
Pascal Belloncle

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:

  1. Mon application doit être disponible sur un système distribué exécutant chacun plusieurs instances de nœud

  2. Chaque système doit avoir un équilibreur de charge qui aide à répartir le trafic entre les instances de nœud.

  3. 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.

  4. 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:

  1. Utilisez des modules comme cluster pour démarrer plusieurs instances de noeud dans un système.

  2. 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

  3. 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:

  1. redimensionnement horizontal node.js et websockets.
  2. tilisation du cluster pour tirer parti de plusieurs cœurs.

Je continuerai de mettre à jour cette réponse au fur et à mesure de ma progression.

5

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.

2
Nick Mitchinson

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.

1
Cartucho