Scaling Node.js

86

Ich bin ziemlich neu in der umfangreichen serverseitigen Entwicklung. Ich möchte einen Server mit Node.js schreiben, aber bevor ich weitermache, möchte ich wissen, wie die allgemeinen Prinzipien für die Skalierung von Knoten auf beispielsweise 20 Abfragen pro Sekunde aussehen.

Der Dienst, den ich schreibe, wird größtenteils eine Schnittstelle zu einer Datenbank sowie die Authentifizierung und Validierung von Eingabedaten sein.

Nornagon
quelle
Was meinst du mit "Skalieren des Knotens"? Prozesse mit mehreren Knoten starten?
Thilo
3
20 Abfragen pro Sekunde sind ziemlich niedrig. Node.js sollte in der Lage sein, Tausende von gleichzeitigen Verbindungen zu verarbeiten. Führen Sie nur keine Heavy-Loop-Verarbeitung durch, da dies den gesamten Interpreter blockiert. Ihr Anwendungsfall sollte im Vergleich relativ leicht sein. In Node werden Datenbankverbindungen automatisch zu Threads erzeugt und auf Javascript-Ebene asynchron behandelt.
Slebetman

Antworten:

149

Lastverteilung

Höchstwahrscheinlich benötigen Sie für die einfachsten Websites überhaupt keine Skalierung. Mit nur einer einzigen Box sind Sie abgesichert. Danach sollten Sie einen Lastenausgleich durchführen, wie Sie bereits erwähnt haben, der für jede Architektur fast gleich ist (wie Sie sagen, Sie könnten zuerst mehrere Knotenprozesse starten. Wenn Sie jedoch sehr groß werden, benötigen Sie mehr Boxen).

Beispiel für einen Nginx-Lastausgleich :

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 Abfragen pro Sekunde

Kein Schweiß für node.js. Sie sollten redis als Datenspeicher verwenden, da es schnell verrückt ist :). Es gibt sogar eine Wechselstrombibliothek für Knoten, wenn Sie node_redis verwenden .

npm install hiredis redis

Hiredis bietet Ihnen eine hervorragende Leistung, da es innerhalb des Knotens zu C-Code kompiliert wird. Hier sind einige Benchmarks von Redis bei Verwendung mit 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

Wenn Sie sich diese Zahlen ansehen, dann sind 20 / s NICHTS :).

Authentifizierung


Aktualisieren:


Ich erzähle das viel, aber aus Liebe zu Gott versuchen Sie bitte nicht, Ihr eigenes Authentifizierungssystem zu implementieren. Es wird wahrscheinlich unsicher sein (viel kann schief gehen), viel Arbeit. Für die Authentifizierung sollten Sie Facebook-Connect, Twitter Single Sign-In usw. mit der hervorragenden Connect-Auth- Bibliothek verwenden. Dann sind Sie sicher abgesichert, weil sie Experten haben, die dort Anmeldesysteme auf Löcher testen und die Passwörter auch nicht per Klartext übertragen, sondern Gott sei Dank für die Verwendung von https. Ich habe auch ein Thema für einen Benutzer beantwortet, der Facebook-Connect verwenden wollte .

Validierung von Eingabedaten

Um die Eingabe zu validieren, können Sie den Node-Validator verwenden .

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

Es gibt auch diese Formularbibliothek, mit der Sie Formulare erstellen können.

Alfred
quelle
1
@nornagon herzlich willkommen :). Denken Sie besonders daran, kein eigenes Login-System zu schreiben;). Auch Jeff Atwood (Stackoverflow-Autor) rät dringend davon ab! => blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred
10
Sie können HAProxy für den Lastausgleich von WebSockets verwenden, da nginx nicht funktioniert :) Vorausgesetzt, Sie entwickeln Anwendungen, bei denen Sie WebSockets irgendwo verwenden müssen! Nur eine Ergänzung zu @ alfreds bereits großartiger Antwort.
Shripad Krishna
5
Ein Beispiel für ein HAProxy-Setup, falls Sie Websockets
Shripad Krishna
9
Gute Antwort. Ich würde passport.js jedoch jedem empfehlen.
UpTheCreek
1
Was ist mit Pass statt Everyauth?
Chovy