web-dev-qa-db-fra.com

Mise à l'échelle de Node.js

Je suis relativement nouveau dans le développement côté serveur à grande échelle. Je veux écrire un serveur en utilisant Node.js, mais avant d'aller de l'avant, j'aimerais savoir quels sont les principes généraux pour faire évoluer le nœud jusqu'à, disons, 20 requêtes par seconde.

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

86
nornagon

L'équilibrage de charge

Très probablement pour les sites les plus simples, vous n'avez pas besoin du tout de mise à l'échelle. Une seule boîte vous couvrira. Après cela, vous devriez faire un équilibrage de charge comme vous le mentionnez, qui est presque le même pour chaque architecture (comme vous dites que vous pouvez commencer plusieurs processus de nœud en premier. Mais lorsque vous devenez vraiment gros, vous avez besoin de plus de boîtes).

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 sueur pour node.js. Vous devez utiliser redis comme magasin de données car il est extrêmement rapide :). Il existe même une bibliothèque c pour le nœud lorsque vous utilisez node_redis .

npm install hiredis redis

Hiredis est ce qui vous donne des performances kickass car il se compile en code C à l'intérieur du nœud. Voici quelques repères de redis lorsqu'il est utilisé avec des 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

Lorsque vous regardez ces chiffres, 20/s est [~ # ~] rien [~ # ~] :).

Authentification


Mise à jour:


J'en dis beaucoup mais pour l'amour de Dieu, n'essayez pas d'implémenter votre propre système d'authentification. Cela va probablement être dangereux (beaucoup de choses peuvent mal tourner), beaucoup de travail. Pour l'authentification, vous devez utiliser facebook-connect, l'authentification unique Twitter, etc. en utilisant l'excellente bibliothèque connect-auth . Ensuite, vous êtes couvert en toute sécurité car ils ont des experts qui testent les systèmes de connexion pour les trous et ne transmettent pas non plus les mots de passe via du texte brut, mais merci pour l'utilisation de Dieu https. J'ai également 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 node-validator .

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

//Validate
check('[email protected]').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 cette bibliothèque forms pour vous aider à créer des formulaires.

148
Alfred