Ridimensionamento Node.js


86

Sono abbastanza nuovo nello sviluppo lato server su larga scala. Voglio scrivere un server usando Node.js, ma prima di andare avanti mi piacerebbe sapere quali sono i principi generali per il ridimensionamento del nodo fino a, diciamo, 20 query al secondo.

Il servizio che sto scrivendo sarà in gran parte un'interfaccia a un database, oltre all'autenticazione e alla convalida dei dati di input.


Cosa intendi per "scalare il nodo verso l'alto"? Avvio di più processi di nodo?
Thilo

3
20 query al secondo sono piuttosto basse. Node.js dovrebbe essere in grado di gestire migliaia di connessioni simultanee. Basta non eseguire pesanti cicli di elaborazione perché bloccherà l'intero interprete. Il tuo caso d'uso dovrebbe essere abbastanza leggero in confronto. In Node, le connessioni al database vengono generate automaticamente nei thread e gestite in modo asincrono a livello di javascript.
Slebetman

Risposte:


149

Bilancio del carico

Molto probabilmente per i siti più semplici non è necessario alcun ridimensionamento. Solo una singola scatola ti coprirà. Dopodiché dovresti eseguire il bilanciamento del carico come stai menzionando che è quasi lo stesso per ogni architettura (come stai dicendo che potresti avviare prima processi a più nodi. Ma quando diventi veramente grande hai bisogno di più scatole).

Esempio di bilanciamento del carico 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 query al secondo

Nessun problema per node.js. Dovresti usare redis come datastore perché è follemente veloce :). C'è anche una libreria ac per node quando usi node_redis .

npm install hiredis redis

Hiredis è ciò che ti dà prestazioni eccezionali perché compila il codice C all'interno del nodo. Di seguito sono riportati alcuni benchmark di redis se utilizzato con 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

Quando guardi quei numeri, 20 / s non è NULLA :).

Autenticazione


Aggiornare:


Lo sto dicendo molto, ma per l'amor di Dio, per favore, non tentare di implementare il tuo sistema di autenticazione. Probabilmente non sarà sicuro (molto può andare storto), molto lavoro. Per l'autenticazione dovresti usare facebook-connect, twitter single sign-in, ecc. Usando l'eccellente libreria connect-auth . Quindi sei al sicuro perché hanno esperti che testano i sistemi di accesso per i buchi e inoltre non trasmettono le password tramite testo normale ma grazie a Dio usa https. Ho anche risposto a un argomento per un utente che desiderava utilizzare facebook-connect .

convalida dei dati di input

Per convalidare l'input è possibile utilizzare node-validator .

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>'

C'è anche questa libreria di moduli per aiutarti a creare moduli.


1
@nornagon il tuo benvenuto :). Ricorda soprattutto di non scrivere il tuo sistema di login;). Anche Jeff Atwood (autore di Stackoverflow) lo sconsiglia vivamente! => blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred

10
Puoi usare HAProxy per il bilanciamento del carico WebSocket poiché nginx non funzionerà :) Questo è a condizione che tu stia sviluppando applicazioni che richiedono l'uso di WebSocket da qualche parte! Solo un'aggiunta alla già fantastica risposta di @ alfred.
Shripad Krishna

5
Un esempio di configurazione HAProxy, nel caso in cui si utilizza WebSockets: stackoverflow.com/questions/4360221/...
Shripad Krishna

9
Buona risposta. Consiglio vivamente passport.js su everyauth però.
UpTheCreek

1
che dire del passaporto invece di everyauth?
chovy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.