87 votes

Mise à l'échelle de Node.js

Je suis assez novice en matière de développement côté serveur à grande échelle. Je souhaite écrire un serveur à l'aide de Node.js, mais avant de me lancer, j'aimerais connaître les principes généraux permettant de faire évoluer Node jusqu'à, disons, 20 requêtes par seconde.

Le service que j'écris sera principalement une interface vers une base de données, plus l'authentification et la validation des données d'entrée.

0 votes

Qu'entendez-vous par "mise à l'échelle d'un nœud" ? Lancer plusieurs processus de nœuds ?

3 votes

20 requêtes par seconde, c'est assez faible. Node.js devrait être capable de gérer des milliers de connexions simultanées. Il suffit de ne pas faire de traitement lourd en boucle car cela bloquerait l'ensemble de l'interpréteur. Votre cas d'utilisation devrait être assez léger en comparaison. Dans Node, les connexions aux bases de données sont automatiquement créées dans des threads et gérées de manière asynchrone au niveau du javascript.

150voto

Alfred Points 32190

Équilibrage de la charge

Pour les sites les plus simples, vous n'avez probablement pas besoin de mise à l'échelle. Un seul boîtier suffira à vous couvrir. Après cela, vous devriez faire de l'équilibrage de charge comme vous le mentionnez, ce qui est presque la même chose pour toutes les architectures (comme vous le dites, vous pourriez commencer par des processus à nœuds multiples. Mais lorsque vous devenez vraiment gros, vous avez besoin de plus de boîtiers).

Exemple d'équilibrage de charge Nginx :

http {
  upstream myproject {
    server 127.0.0.1:8000 weight=3;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;    
    server 127.0.0.1:8003;
  }

  server {
    listen 80;
    server_name www.domain.com;
    location / {
      proxy_pass http://myproject;
    }
  }
}

Redis

20 requêtes par seconde

Pas de problème pour node.js. Vous devriez utiliser redis comme votre datastore car il est incroyablement rapide :). Il existe même une bibliothèque c pour node lorsque vous utilisez nœud_redis .

npm install hiredis redis

Hiredis est ce qui vous donne les performances les plus élevées parce qu'il se compile en code C à l'intérieur de node. Voici quelques benchmarks de redis lorsqu'il est utilisé avec Hiredis.

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

Quand vous regardez ces chiffres, alors 20/s est NOTHING :).

Authentification


Mise à jour :


Je le répète souvent, mais pour l'amour de Dieu, n'essayez pas de mettre en place votre propre système d'authentification. Il ne sera probablement pas sûr (beaucoup de choses peuvent mal tourner) et demandera beaucoup de travail. Pour l'authentification, vous devriez utiliser facebook-connect, twitter single sign-in, etc. en utilisant l'excellent logiciel connect-auth bibliothèque. Vous êtes alors en sécurité car des experts testent les systèmes de connexion pour détecter les failles et ils ne transmettent pas non plus les mots de passe en clair, mais utilisent https, Dieu merci. J'ai aussi répondu à un sujet pour un utilisateur qui voulait utiliser facebook-connect .

validation des données d'entrée

Pour valider l'entrée, vous pouvez utiliser validateur de nœuds .

var check = require('validator').check,
    sanitize = require('validator').sanitize

//Validate
check('test@email.com').len(6, 64).isEmail();       //Methods are chainable
check('abc').isInt();                               //Throws 'Invalid integer'
check('abc', 'Please enter a number').isInt();      //Throws 'Please enter a number'
check('abcdefghijklmnopzrtsuvqxyz').is(/^[a-z]+$/);

//Sanitize / Filter
var int = sanitize('0123').toInt();                  //123
var bool = sanitize('true').toBoolean();             //true
var str = sanitize(' \s\t\r hello \n').trim();      //'hello'
var str = sanitize('aaaaaaaaab').ltrim('a');        //'b'
var str = sanitize(large_input_str).xss();
var str = sanitize('&lt;a&gt;').entityDecode();     //'<a>'

Il y a aussi ceci formulaires pour vous aider à créer des formulaires.

1 votes

@nornagon votre bienvenue :). N'oubliez surtout pas de ne pas écrire votre propre système de connexion ;). Jeff Atwood (auteur de Stackoverflow) le déconseille fortement ! => blog.stackoverflow.com/2010/04/openid-one-year-later

0 votes

Oui, je n'en avais pas l'intention.

10 votes

Vous pouvez utiliser HAProxy pour équilibrer la charge des WebSockets, car nginx ne fonctionnera pas :) C'est à condition que vous développiez des applications qui vous obligent à utiliser les WebSockets quelque part ! Juste un ajout à la réponse déjà impressionnante de @alfred.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X